vector :: clear()导致seg错误

时间:2013-03-08 08:42:56

标签: c++ stl

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

//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()会导致seg错误?我最初有

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

并遇到了同样的问题。我切换到上面调试。 这是在gcc 4.7.2,x86_64

2 个答案:

答案 0 :(得分:3)

IF 它会在调用'data.clear'时严重崩溃(我的意思是,正好在这一行,而不是在明确的内部),请务必检查this指向断层线的指针。

如果由于先前错误的累积影响,你的$ this为null或者是垃圾值,那么这一行可能会出现类似行为。

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

您可以在调试器中轻松检查'this'指针是否为NULL。此外,检测垃圾值并不难:向A类添加一些测试字段,在构造函数中填充一些可预测的BUT NOT CONSTANT值,当应用程序崩溃时,检查this-&gt; mytestvalue是否正常。如果$ this被删除,那么指向的测试值通常几乎是随机的。

答案 1 :(得分:2)

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