通过启动类对象我有一个奇怪的问题。 这个问题很奇怪,不易再现。但是我会尝试给出一个指示示例。 我有继承类。
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();
我应该如何正确地启动一个对象,特别是当它有默认构造函数和带参数的对象时。
答案 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();