【问题标题】:Segmentation Fault while std::string assignmentstd::string 赋值时出现分段错误
【发布时间】:2011-09-17 15:42:15
【问题描述】:

我有一个名为Sample 的类,其中包含一个参数value,其类型为std::string。 有一个公共成员函数setValue(std::string tempdata),用来设置这个成员的值。

void Sample::setValue( std::string tempdata ) { this->value= tempdata; }

我必须从应用程序中设置此参数的值。 我会这样做:

std::string tempvalue = "Hello";
Sample s;
s.setValue( tempvalue );

当我运行应用程序时程序崩溃并通过 gdb 调试它时我得到:

#0  0x049da761 in __gnu_cxx::__exchange_and_add () from /usr/lib/libstdc++.so.6
#1  0x049c0e6e in std::string::assign () from /usr/lib/libstdc++.so.6
#2  0x049c0ed1 in std::string::operator= () from /usr/lib/libstdc++.so.6
#3  0x08075e9b in Sample::setValue (this=0x83779a8, tempdata=Cannot access memory at address 0xffffffff )

谁能建议我应该如何调试这个问题?

【问题讨论】:

  • 代码看起来没问题。您是否修改了头文件而不重新编译包含它的文件? (例如,如果您正在使用 Makefile 并且在其中定义了这些目标,则执行 make clean 然后 make
  • 这看起来是gcc的内部问题,见stackoverflow.com/questions/7038124/…

标签: c++ string memory


【解决方案1】:

您显示的代码是正确的。所以错误在别处。例如,它可能是早期的堆栈或堆损坏,直到执行这些代码行时才会注意到。

【讨论】:

  • 值得注意的是,tempdata 在堆栈跟踪中是 0xffffffff。这是非常...不寻常的,至少对于上面粘贴的代码而言。
  • 此代码是我正在尝试运行的更大应用程序的一部分。只是当我尝试为类成员赋值时代码崩溃了。我同意这可能是堆或堆栈损坏,但如何在如此大的应用程序中查找它并且 0xffffffff 是否表示重要的东西? - 阿米特
  • 嗯,这表明有人在某个时刻将值0xffffffff 写入了这部分内存。 ;) 我认为@Chris 的观点是它不是一个普遍的价值。您通常会看到 一次 有效的指针值(指向已被释放的内存块),或者在调试版本中,您可能会看到特殊值,例如 0xcdcdcdcd0xdeadbeef 或未初始化或已释放内存的其他可识别模式。 0xffffffff 的唯一意义在于它不是指向数据或代码的指针。所以有人在你的tempdata指针上写了一些非指针数据。
  • 您可以尝试在指针上设置数据断点,以便在更改该地址的内容时调试器将中断。
  • 我不知道我们可以在内存地址上设置断点。我会试试这个。
猜你喜欢
  • 1970-01-01
  • 2014-05-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-18
相关资源
最近更新 更多