1

我是 C/CPP 应用程序的新手,正在分析一段 C/CPP 代码的问题。我遇到了分段错误错误,我不打算确定分段错误的根本原因。

请找到以下场景:

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;

线。

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

任何帮助深表感谢。谢谢

~杰根

4

4 回答 4

3

您可能想要执行以下操作:

value.value_string = new RWCString(value_string_arg);

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

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

于 2010-11-15T20:39:21.147 回答
2

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

在 C++ 中,您通常会通过value.value_string = new RWCString;预先执行类似操作(并在完成后确保delete它)来获得一块有效的内存。但是,这在您的情况下很危险,因为您已经创建了指针的联合。一旦您写入 eg value.value_float,您将丢失指针值,并且您将发生内存泄漏。

于 2010-11-15T20:39:13.343 回答
2

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

于 2010-11-15T20:39:41.193 回答
0

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

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

所以假装没有union,你真的有一个RWCString*指针:你确定它指向一个有效的对象吗?什么时候RWCString建造的,它的寿命是多少?

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

于 2010-11-15T20:41:12.177 回答