7

昨日誰かが私にエラーのあるプログラムをくれました。MVS 2010 で作業して、問題とその代替手段も見つけました。問題は、クラスのオーバーロードされた挿入演算子でした。そのプロトタイプは次のとおりでした...

void matrix :: operator << (matrix&) ;

こんなところから呼び出された…

matrix m ;
m.operator << (m) ;

関数が呼び出された参照パラメーターと同じオブジェクトをコンパイラーが送信することを許可していないことがわかりました。しかし、その背後にある理由と、それがどのような問題を引き起こすのかはわかりません。誰かがそれを説明できれば幸いです。ありがとう。

EDIT: 実際に起こっているのは、デバッグ時に関数内に入り、出てきて実行時mainに外部依存ファイルに入り、dbgdel.cppこの行で停止することです。

 _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
4

3 に答える 3

5

与えられたコードは、.NET で問題なくコンパイルおよび実行されVS2010 SP1ます。

示されているコードにも問題はなく、完全に合法です。演算子のオーバーロードを宣言してからそれを operator<<で呼び出すのは少し奇妙ですm << m

いくつかの推測:

  • オペレーター実装のどこかのアドレスを取得しm、誤って削除しています
  • 演算子の実装内で、おそらくマトリックスに格納されている値の配列の境界を超えています。
  • 呼び出し元のコードと呼び出されたコードの間で、コンパイラとリンカーの想定に不一致があります。呼び出し規約、両側のランタイム ライブラリのバージョン、および SECURE_SCL やインタレータ デバッグなどのその他の設定を確認してください。
于 2012-09-14T14:58:11.423 に答える
1

実装するメソッドでは、operator <<自己参照を確認してください。

void matrix :: operator << (matrix& other) 
{
  if (this == &other) 
  {
    /* special processing */
  }
 else
  {
    /* regular code */
  }
}
于 2012-09-12T15:00:31.320 に答える
1

あなたのプログラムは、ヒープが壊れていると言っているようです: ある時点で、ヒープが配列の境界を超えたか、解放されたポインターを介してメモリに書き込まれたか、またはそのようなものです。

これらのバグが発生した正確な時期がわからないため、追跡が困難な場合がありますが、エラーが発生した場所とは別の場所で発生した可能性が非常に高いです。あなたが持っている方法で参照パラメーターを使用しても問題はありません。

ここでヒープの破損を検出する方法についての提案がたくさんあります。

Win32 でのヒープの破損。見つける方法は?

于 2012-09-16T07:56:45.037 に答える