对象创建引起的 C++ 奇怪的分段错误

Posted

技术标签:

【中文标题】对象创建引起的 C++ 奇怪的分段错误【英文标题】:C++ strange segmentation fault by object creation 【发布时间】: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() 您还可以将基类和派生类中的构造函数之一声明为“显式”以避免混淆编译器。 【参考方案1】:

你的最后一期先...

FooClass foo1();

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

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

【讨论】:

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

需要

FooClass foo1;
foo1.doSomething();

【讨论】:

抱歉,打错字了。我用 '。'实际上。 是的,我刚刚听懂了。谢谢。

以上是关于对象创建引起的 C++ 奇怪的分段错误的主要内容,如果未能解决你的问题,请参考以下文章

分段错误推回在其类函数c ++的循环内创建的对象

Objective-C 中的分段错误是啥?

C++:奇怪的分段错误

Pthread_create 在 C++ 中导致分段错误

在 C++ 中嵌入 python:奇怪的分段错误

为啥分段错误是由类变量顺序引起的?