【问题标题】:C++ strange segmentation fault by object creation对象创建引起的 C++ 奇怪的分段错误
【发布时间】:2010-11-05 13:04:01
【问题描述】:

通过启动类对象,我遇到了一个奇怪的问题。 这个问题很奇怪,也不容易重现。但是,我将尝试举一个说明性的例子。 我有继承类。

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();

我应该如何正确地初始化一个对象,尤其是当它有默认构造函数和带有参数的对象时。

【问题讨论】:

  • 你在第 42 行有一个错误,就在这些点之间。
  • 这完全是关于构造函数和doSomething() 所做的事情——这就是用户 VJo 想要告诉的。请输入足以重现问题的完整类定义。
  • -1 这个问题本质上是“我的密码有问题,出了什么问题,顺便说一下,这里还有一些其他代码甚至无法编译”。
  • 别含糊,做个王牌;写一个合适的测试用例! tinyurl.com/so-hints sscce.org xs4all.nl/~weegen/eelis/iso-c++/testcase.xhtml (虽然我不会在这么新的问题上投反对票,但你一定要解决这个问题。)
  • 不应该 FooClass() {} 是: FooClass() : BarClass() {} 您还可以将基类和派生类中的构造函数之一声明为“显式”以避免混淆编译器。

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


【解决方案1】:

你的最后一期先...

FooClass foo1();

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

为什么你得到一个分段错误可能与你的析构函数有关,我们看不到,这在你的第二个泄漏示例中没有被调用。

【讨论】:

  • 感谢您的所有建议和 cmets。很抱歉,我无法有一个明确的测试用例,并以某种方式给出了一个误导性的问题。在考虑了这些建议后,我尝试逐步研究我的构造函数,发现是的!问题是内存使用量大。我把问题放在另一个问题stackoverflow.com/questions/4106655/…
【解决方案2】:

您的构造函数或doSomething() 中可能存在一些错误。如果不知道这些函数中发生了什么,就无法说出该错误到底是什么。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      仅将-> 与指针一起使用。

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

      需要

      FooClass foo1;
      foo1.doSomething();
      

      【讨论】:

      • 抱歉,打错字了。我用 '。'实际上。
      • 是的,我刚刚听懂了。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多