2016-06-11 10 views
-6

私のクラス(Distributionと呼ばれる)のいずれかのデストラクタがdouble free or corruptionエラーを投げています。私はバックトレースを行うと、私はこれを取得:Distributionデストラクタが終了し、それがベクトルにデストラクタを呼び出そうとした場合に ベクトルの二重の空きまたは破損

#7 0x0000000000409212 in std::vector<double, std::allocator<double> >::~vector (
this=0x7fffffff8f70) 
at /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/stl_vector.h:351 
#8 0x00000000004032c5 in Distribution::~Distribution (this=0x7fffffff8f28) 
at Distribution.cpp:165 

だからエラーが発生します。それはポインタや何かではなく、倍精度を含む単純なベクトルです。 ~vectorがこのエラーの原因となりますか?

ETA:ここでは簡単なコード例を役立てることはできません。私のコードのいくつかの場所では、すべてのことが起こっているし、どの部分が適切であるかについての良い感覚はありません。コメントはメモリ破損の問題だと私はそれを探すことができることを示唆している。

+1

デストラクタでプログラムがクラッシュしたとしても、そのバグはどこにあるのか分かりません。 C++へようこそ。 [mcve]を投稿する必要があります。 –

+1

ベクトルのデストラクタは問題を引き起こしていませんが、あなたのコード内には何か他のものがあります。残念ながら、あなたは多くの情報を提供していません。 –

+1

多くの場合、メモリの問題は後で表示されません。あなたが何かを壊してしまったのであれば、あなたはメモリを解放しようとするまで知らないかもしれません。 –

答えて

3

代表的なMCVEがなければ、具体的な回答は事実上不可能です。

一般的に言えば、他のコード(おそらくオブジェクトのコンストラクタとデストラクタの呼び出しの間に呼び出されますが、オブジェクトが構築される前であってもかまいません)は、ポインタ。

非常に間接的な影響があります。不正な操作が発生した場合にすぐにクラッシュが発生するという保証はありません。実際には、目に見える症状がなければ障害が発生し、無関係なコードでは動作の微妙な変化が起こりますが、最終的には、オペレーティングシステムが検出できるより大きな機能不全を引き起こし、プログラムを終了させます。

あなたのケースでは、このようなイベントのカスケードには、おそらくベクトルアロケータの動作を邪魔する効果があります。その結果、完全に無関係のコードになっているにもかかわらず、ベクトルのデストラクタにクラッシュが発生します。

+0

これは、ベクトルを格納するフィールドが誤って上書きされていることを意味しますか? –

+0

それはそれを意味するかもしれません。それは何かを意味するかもしれない。無効なアドレスへの書き込みの結果は定義されていません。つまり、結果として何が起こるかについて定義された制約はありません。 – Peter

+0

Thanks Peterさん、あなたのコメントは私がエラーを見つけるために知る必要があったことを教えてくれました。私は実際にベクトルを格納していたメモリを上書きしていました。 –

関連する問題