C++;在G++;-不使用指针时出现分段错误 我试图用G++来编译一些C++代码。它在其他编译器中似乎工作得很好,但无论出于何种原因,G++都不会产生工作输出

C++;在G++;-不使用指针时出现分段错误 我试图用G++来编译一些C++代码。它在其他编译器中似乎工作得很好,但无论出于何种原因,G++都不会产生工作输出,c++,g++,segmentation-fault,C++,G++,Segmentation Fault,披露:这是家庭作业的一部分,但我觉得这更像是一个编译器问题,因为它可以在其他编译器中工作 以下是造成巨大破坏的片段: set<int> t1, t2; .h如下所示: #include "bag.h" template <class T> class set : public bag<T> { public: set( ); set(const set &b); // ... }; #include "

披露:这是家庭作业的一部分,但我觉得这更像是一个编译器问题,因为它可以在其他编译器中工作

以下是造成巨大破坏的片段:

set<int> t1, t2;
.h
如下所示:

#include "bag.h"

template <class T>
class set : public bag<T>
{ 
    public:
        set( );
        set(const set &b);

// ...

};
#include "set.cpp"
using namespace std;

template <class T>
bag<T>::bag() {
    head = NULL;
}

template <class T>
bag<T>::bag(const bag<T>& b) {

    // ...

}
bag.h

template <class T>
class bag
{ 
    public:
        bag( );
        bag(const bag &b);

    // ...
};
#include "bag.cpp"
模板
书包
{ 
公众:
袋子();
行李(康斯特行李和早餐);
// ...
};
#包括“bag.cpp”

再一次,我觉得G++讨厌我,但我可能会做一些愚蠢的事情。只要朝正确的方向轻推一下就好了。

这里有一个一般性的提示,它会让你的生活轻松一百万倍

使用“-g”和“-Wall”标志编译此程序:

“-g”添加调试信息。“-Wall”在编译时会发出额外的警告。然后使用调试器:

gdb ./a.out
点击run开始你的程序。一旦你的代码被删除,使用bt转储你的调用堆栈 撞车。然后,您可以在代码中准确地看到崩溃发生的位置


当你在它,谷歌“gdb教程”。花一两个小时学习如何正确地使用gdb会有回报的,而且会很有兴趣。我向你保证。

使用名称空间std
并将类命名为标准库名(
set
)只能以眼泪告终。
set
bag
的析构函数到底做了什么?(当您像在第一个代码段中一样在堆栈上创建对象时,该对象在其封闭范围块的末尾被销毁。当您像在第二个代码段中一样使用
new
动态创建对象时,当您
删除它时,该对象将被销毁。如果您从未
删除它,析构函数将永远不会被销毁。)被调用;我猜析构函数中的某些东西可能是导致您的问题的原因。@James:我将该类重命名为
离散集
。没有效果。对于析构函数,它迭代一个链表并删除每个节点的值。没什么特别的,不过我会修补一下让你知道。谢谢你!除非你的集合表现出谨慎,并且在行为和言语上是明智的,否则你可能想将它命名为
discrete\u set
:-)[不过,说真的,这证明了不在文件范围内使用指令的一个很好的理由。它们只会带来麻烦。从长远来看,仅限定名称空间中的名称要容易得多。]哈哈,我的错。实际上它被命名为离散集,但这不是我手指想要输入的。现在有点晚了;我是怎么走的。还有,天哪。有史以来最好的事情
gdb
是我最喜欢的新“玩具”。非常感谢!
template <class T>
class bag
{ 
    public:
        bag( );
        bag(const bag &b);

    // ...
};
#include "bag.cpp"
gcc -g -Wall foo.cpp
gdb ./a.out