C++ 的核心转储分段错误
Posted
技术标签:
【中文标题】C++ 的核心转储分段错误【英文标题】:core dump segmentation fault with C++ 【发布时间】:2010-11-15 20:36:00 【问题描述】:我是 C/CPP 应用程序的新手,正在分析一段 C/CPP 代码的问题。我遇到了 Segmentation Fault 错误,我不想找出分段错误的根本原因。
请找出以下场景:
union Value
当应用程序使用这段代码时,它会在运行时生成分段错误并终止。我放置了一些控制台输出语句,并理解分段错误可能是由于
*(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
。初学者可能不应该使用union
s,因为如果你初始化一个成员然后尝试使用另一个成员,你会炸毁。
所以假装没有union
而你确实有一个RWCString*
指针:你确定它指向一个有效的对象吗? RWCString
是什么时候构建的,它的生命周期是多久?
当然,分段错误并不总是发生在无效代码上。在此之前你可能会发生其他不好的事情,然后再咬你。
【讨论】:
以上是关于C++ 的核心转储分段错误的主要内容,如果未能解决你的问题,请参考以下文章