【发布时间】:2010-02-23 14:32:49
【问题描述】:
我有一个包含 7 种类型的 boost 变体。当我尝试使用最后两种类型时,链接器会出现段错误。我在 64 位 linux 机器上使用 g++(SuSE Linux 上的 gcc 版本 3.3.3),我得到的错误是
collect2: ld terminated with signal 11 [Segmentation fault]
不管我把类型放在什么顺序,最后两个在我尝试使用它们时会导致段错误。任何想法为什么会发生这种情况?
代码:
typedef boost::tuple<std::string, Class1::Ptr> Class1Tuple;
typedef boost::tuple<std::string, Class2::Ptr> Class2Tuple;
typedef boost::tuple<std::string, Class3::Ptr> Class3Tuple;
typedef boost::tuple<std::string, Class4::Ptr> Class4Tuple;
typedef boost::tuple<std::string, Class5::Ptr> Class5Tuple;
typedef boost::tuple<std::string, Class6::Ptr> Class6Tuple;
typedef boost::tuple<std::string, Class7::Ptr> Class7Tuple;
typedef boost::variant< Class1Tuple, Class2Tuple, Class3Tuple,
Class4Tuple, Class5Tuple, Class6Tuple,
Class7Tuple > ClassTupleItem;
ClassX::Ptr 是指向该类的 boost 共享指针。 Ptr 在类本身中定义为 typedef,如下所示
struct Class1
{
typedef boost::shared_ptr<Class1> Ptr;
...
...
}
当我尝试使用 boost 变体中的最后两种类型时
Class1Tuple tup("str", pointer);
ClassTupleItem(tup); // works fine since I used Class1Tuple
Class6Tuple tup2("str", pointer2);
ClassTupleItem(tup2); // causes a segfault.
如果我将 boost::variant 定义为(交换 Class6 和 Class1)
typedef boost::variant< Class6Tuple, Class2Tuple, Class3Tuple,
Class4Tuple, Class5Tuple, Class1Tuple,
Class7Tuple > ClassTupleItem;
然后我在编译这段代码时遇到了段错误
Class1Tuple tup("str", pointer);
ClassTupleItem(tup); // worked earlier
【问题讨论】:
-
请提供邮政编码。这些信息不足以诊断问题。
-
实际的错误信息也会有所帮助
-
如果我不得不猜测的话,也许损坏的名称溢出了链接器和编译器的内部缓冲区。如果您的 typedef 本身位于命名空间中,请尝试将它们取出并查看问题是否消失。尽管如此,无论是编译器还是链接器错误,段错误都是如此,您应该使用简单的测试用例将它们提交给 GCC bugzilla。
-
上面也贴出了实际的错误信息。这是我收到的唯一信息
-
拥有您正在使用的
g++的版本会很有帮助,可以尝试复制:)
标签: c++ g++ segmentation-fault boost-variant