C++ 的核心转储分段错误

Posted

技术标签:

【中文标题】C++ 的核心转储分段错误【英文标题】:core dump segmentation fault with C++ 【发布时间】:2010-11-15 20:36:00 【问题描述】:

我是 C/CPP 应用程序的新手,正在分析一段 C/CPP 代码的问题。我遇到了 Segmentation Fault 错误,我不想找出分段错误的根本原因。

请找出以下场景:

union Value

整数值整数; 浮动值_浮动; RWCString *value_string;

无效 setValueString(const RWCString &value_string_arg) *(value.value_string) = value_string_arg; //value 是对 UNION 值的引用。

当应用程序使用这段代码时,它会在运行时生成分段错误并终止。我放置了一些控制台输出语句,并理解分段错误可能是由于

*(value.value_string) = value_string_arg;

行。

谁能验证我对分段错误的识别?另外,我不太确定要解决这个问题。请让我知道是否有人对此有想法。

非常感谢任何帮助。谢谢

~杰根

【问题讨论】:

您需要找到 RWCString 的定义,因为这不是常见的字符串类型,而且 C/CPP 也不存在。你正在用 C++ 编写。 仅供参考,RWCString 恰好是 Rogue Wave C++ 库中的通用字符串类型。 【参考方案1】:

你可能想做这样的事情:

value.value_string = new RWCString(value_string_arg);

在您的代码中,如果value.value_string 是一个未初始化的指针,那么您所做的分配将尝试写入内存的某个随机部分,从而导致分段值。在我上面的代码中,new 运算符为RWCString 分配一个新的内存块,并调用复制构造函数 来复制value_string_arg。然后它将指向新分配的内存块的指针分配给value.value_string

当你完成后不要忘记delete value.value_string以避免内存泄漏!

【讨论】:

【参考方案2】:

当您执行*(value.value_string) 时,您取消引用指针,即您要求编译器设置value.value_string 所指向的事物的值。您需要确保它指向有效的内存。如果你不这样做,那么当你分配给它时,你最终会写入内存中的一个随机位置,因此会出现分段错误。

在 C++ 中,您通常会通过事先执行value.value_string = new RWCString; 之类的操作(并确保您在完成后使用delete)来获得一块有效的内存。但是,在您的情况下,这是危险的,因为您已经创建了指针的联合。只要你写信给例如value.value_float,指针值丢失,内存泄漏。

【讨论】:

【参考方案3】:

尝试使用 gdb 分析核心转储。核心转储应该准确地向您显示段错误发生的位置。您需要在启用调试的情况下进行编译。

【讨论】:

【参考方案4】:

(您使用的语言是 C++。不是 C/CPP 或 C/C++。)

这里的主要问题:您使用的是union。初学者可能不应该使用unions,因为如果你初始化一个成员然后尝试使用另一个成员,你会炸毁。

所以假装没有union 而你确实有一个RWCString* 指针:你确定它指向一个有效的对象吗? RWCString 是什么时候构建的,它的生命周期是多久?

当然,分段错误并不总是发生在无效代码上。在此之前你可能会发生其他不好的事情,然后再咬你。

【讨论】:

以上是关于C++ 的核心转储分段错误的主要内容,如果未能解决你的问题,请参考以下文章

C++ 的核心转储分段错误

C++ 代码的分段错误(核心转储)

c++:分段错误(核心转储)

C++ 地图分段错误(核心转储)

分段错误(核心转储) - 无法访问的计数器值

C++ std 线程和列表分段错误(核心转储)