G ++中的C ++ - 不使用指针时的分段错误

时间:2010-10-12 05:00:01

标签: c++ g++ segmentation-fault

我正在尝试使用G ++编译一些C ++代码。它似乎在其他编译器中工作正常,但无论出于何种原因,G ++都不会产生工作输出。

披露:这是家庭作业的一部分,但我觉得这更像是一个编译器问题,因为它适用于其他编译器。

这是造成严重破坏的片段:

set<int> t1, t2;

这很奇怪,因为下面的代码工作得很好:

set<int> *t1 = new set<int>();
set<int> *t2 = new set<int>();

当然,我必须使用->代替.,但这是预期的。第一个片段在运行时产生分段错误。第二个直观地表达了我的期望。

无论如何,在幕后,.cpp set有这个:

#include <cstdlib>
#include <iostream>

using namespace std;

template <class T>
set<T>::set() : bag<T>() {}

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

.h看起来像这样:

#include "bag.h"

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

// ...

};
#include "set.cpp"

最后但并非最不重要的是,bag.cppbag.h文件如下所示:

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"

同样,我觉得G ++只是讨厌我,但我又一次可能会做一些愚蠢的事情。只是在正确的方向上进行简单的推动就会很棒。

1 个答案:

答案 0 :(得分:8)

这是一个普遍的提示,可以让你的生活更轻松一百万次。

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

gcc -g -Wall foo.cpp

“-g”添加调试信息。编译时,“-Wall”会发出其他警告。然后使用调试器:

gdb ./a.out

运行启动程序。使用 bt 转储代码后的调用堆栈 崩溃。然后,您可以确切地看到代码中发生崩溃的位置。

当你在这里时,谷歌“gdb教程”。花一两个小时学习如何正确使用gdb将会带来兴趣。我保证你。