通过对象创建C ++奇怪的分段错误

时间:2010-11-05 13:04:02

标签: c++ class object constructor segmentation-fault

通过启动类对象我有一个奇怪的问题。 这个问题很奇怪,不易再现。但是我会尝试给出一个指示示例。 我有继承类。

class BarClass {
public:
   BarClass() {
      ...
   }
   BarClass(int i, int j) {
      ...
   }
   void doSomething() { ... }
};
class FooClass : public BarClass {
public:
   FooClass() {
   }
   FooClass(int i, int j) : BarClass(i,j) {
      ...
   }
};

有时如果我用以下方式启动对象,我会通过初始化得到分段错误错误。

FooClass foo1;
foo1.doSomething();
FooClass foo2(10, 20);
foo2.doSomething();

如果我使用显式指针new,那就没关系..

FooClass *foo1= new FooClass();
foo1->doSomething();
FooClass foo2(10, 20);
foo2.doSomething();

以下代码会在第2行给出编译错误。

FooClass foo1();
foo1.doSomething();
FooClass foo2(10, 20);
foo2.doSomething();

我应该如何正确地启动一个对象,特别是当它有默认构造函数和带参数的对象时。

4 个答案:

答案 0 :(得分:7)

你的上一期问题......

FooClass foo1();

不会创建FooClass类型的对象,但会声明一个名为foo1()的函数,该函数不接受任何参数并返回FooClass。删除括号以创建实例,就像在第一个代码示例中一样。

为什么你得到一个segmmentation错误可能与我们无法看到的析构函数有关,而且在第二个泄漏的例子中不会调用它。

答案 1 :(得分:2)

您的构造函数或doSomething()中可能存在一些错误。在不知道这些函数中发生了什么的情况下,没有办法确定错误到底是什么。

答案 2 :(得分:2)

很可能sizeof(YourClass)对于堆栈来说太大了,这可以解释为什么只有堆分配成功。

答案 3 :(得分:0)

仅使用带有指针的->

FooClass foo1();
foo1->doSomething();

需要

FooClass foo1;
foo1.doSomething();