1

我有一个 std::vector 导致一些非常奇怪的段错误

//A.h
class A{
private:
  std::vector<float> data;
public:
  void set(const std::vector<float>& data);
};
//A.cpp
void A::set(const vector<float>& data){
  this->data.clear(); // crashes on this line
  for(float f : data) this->data.push_back(f);
}

在什么情况下 vector::clear() 会导致段错误?我最初有

void A::set(const vector<float>& data){
  this->data = data;
}

并有同样的问题。我切换到上面进行调试。这是在 gcc 4.7.2、x86_64 上

4

2 回答 2

3

如果它恰好在调用“data.clear”时崩溃(我的意思是,正好在这一行,而不是在 clear 内的某个地方),那么一定要检查你的this指针在故障行。

如果由于先前错误的累积影响,您的 $this 以某种方式为 null 或垃圾值,则此行的行为可能类似。

另一方面,(几乎),如果它实际上在 clear 内的某个地方崩溃了,而您只是切断了堆栈跟踪以使问题描述更简洁,那么仍然有可能是相同的原因。

您可以在调试器中轻松检查“this”指针是否为 NULL。此外,检测垃圾值并不难:在A类中添加一些测试字段,在构造函数中填充一些可预测但不是常量的值,当应用程序崩溃时,检查 this->mytestvalue 是否正常。如果 $this 被丢弃,那么指定的测试值通常几乎是随机的。

于 2013-03-08T08:58:36.730 回答
2

这可能是由于其他地方发生的堆栈/内存损坏。您应该使用内存检查器运行您的程序,例如Valgrind使用该memcheck工具来查看发生了什么。

于 2013-03-08T08:47:11.887 回答