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;
}

同じ問題がありました。上記に切り替えてデバッグしました。これはgcc4.7.2、x86_64にあります

4

2 に答える 2

3

' data.clearthis 'の呼び出しで正確にクラッシュする場合(つまり、クリア内のどこかではなく、まさにこの行で)、障害のある行でポインターを確認してください。

以前のバグの累積された影響のために、どういうわけか$ thisがnullまたはtrash-valueである場合、この行は同様に動作する可能性があります。

一方、(ほぼ)一方で、実際にクリア内のどこかでクラッシュし、スタックトレースをカットして問題の説明をより簡潔にした場合でも、同じ原因である可能性があります。

デバッガーで「this」ポインターのNULLを簡単に確認できます。また、trashvaluesの検出は難しくありません。Aクラスにいくつかのテストフィールドを追加し、コンストラクターに予測可能なBUT NOT CONSTANT値を入力し、アプリがクラッシュしたときに、this->mytestvalueが正常かどうかを確認します。$ thisがゴミ箱に捨てられた場合、指摘されたテスト値はほとんどランダムになります。

于 2013-03-08T08:58:36.730 に答える
2

これは、スタック/メモリの破損が別の場所で発生していることが原因である可能性があります。ツールを使用してValgrindなどのメモリチェッカーを使用してプログラムを実行し、何が起こっているかを確認する必要があります。memcheck

于 2013-03-08T08:47:11.887 に答える