2012-03-13 12 views
1

を破損し、私が持っているコードです:ランタイムチェックの失敗#2 - 変数の周りスタックは、ここではC++

#include <iostream> 
#include <typeinfo.h> 

typedef struct A 
{ 

friend class W; 

private: 
     char c; 
     void *v; 
} A; 

typedef struct LL 
{ 

friend class W; 

private: 
     int n; 
     LL *next, *prev; 
} LL; 

class W 
{ 

private: 
     void Handle(void *arg1, void *arg2) 
     { 
       A *ob1 = reinterpret_cast<A*>(arg1); 
       ob1->c = 'c'; 
       ob1->v = (void*)0xffffffff; 

       LL *ob2 = reinterpret_cast<LL*>(arg2); 
       ob2->n = 0xff; 
       ob2->next = new LL(); 
       ob2->prev = 0; 
     } 

protected: 
     void Set() 
     { 
       A *ob1 = new A(); 
       LL *ob2 = new LL(); 

       this->Handle(&ob1, &ob2); 
     } 
}; 

class R : W 
{ 

public: 
     R(void) 
     { 
       this->Set(); 
     } 
}; 

void main(void) 
{ 
     R *ob = new R(); 
} 

は、私はダンプから次の結果を得ている: ランタイムチェックの失敗#2 - 変数 'ob2'の周りのスタックが壊れていました。

'http.exe':C:¥Users¥root¥Documents¥Visual Studio 2008¥Projects¥http¥Debug¥http.exe '
、シンボルがロードされました。
'http.exe':ロード 'C:\ WINDOWS \ SYSWOW64 \ ntdll.dllの'
'http.exe':ロード 'C:\ WINDOWS \ SYSWOW64 kernel32.dllの\'
'http.exe':ロード 'C:\ WINDOWS \ SYSWOW64 \ KernelBase.dll'
'http.exe':ロード 'C:\ WINDOWS \ winsxs \ x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30729.1_none_bb1f6aa1308c35eb \ msvcr90d.dll'
ランタイムチェック失敗#2 - 変数 'ob2'の周りのスタックが壊れていました。

私quesionsは以下のとおりです。
- 私はこの問題を解決するために何をすべき?
- なぜ私はそのようなエラーを持っています、あなたは私に説明することができます、なぜそのexacltyが壊れていたのですか?
- なぜスタックは壊れていますか?ヒープではない?

おかげで、
敬具、

答えて

4
A *ob1 = new A(); 
LL *ob2 = new LL(); 

this->Handle(&ob1, &ob2); 

ob1ob2は、既にポインタです。変数(型のそれぞれA**LL**)のアドレスを取得し、に渡し、A*LL*reinterpret_castと打ち込み、次に書き込まれると、コードは未定義の動作を呼び出します。この特殊なケースでは、ob1ob2変数の近くの場所に書き込まれているように見えます。おそらくSetの呼び出しのスタックフレームにあります。

代わりreinterpret_castで型システムを解体の、コードが適切に使用され、コンパイラはすぐにエラーをキャッチしていた場合は、次の

void Handle(A *arg1, LL *arg2) 
{ 
     ob1->c = 'c'; 
     ob1->v = (void*)0xffffffff; 

     ob2->n = 0xff; 
     ob2->next = new LL(); 
     ob2->prev = 0; 
} 

// ... 
// the compiler would complain about this call making the problem clear 
this->Handle(&ob1, &ob2); 

コードは非常に多くを使用しなかった場合はそれも良いだろうポインタはどこにでも置かれていますが、これは問題を実証するための単純なコードであると仮定します。

関連する問題