0

コピーコンストラクタを扱わずに新しいクラスオブジェクトを安全にコピーするためのオンラインリファレンスを見つけるのは非常に難しいと感じています。私は「CLabel」と呼ばれる子クラスのコンストラクターメソッドに取り組んでおり、この特定のコンストラクターのロジック(これは3つのうちの最初のものです)に対する教授のコメントは次のとおりです。

「この構造は、CLabelを安全にコピーして、メモリリークがないことを保証します。」

関数ヘッダーは次のとおりです。

CLabel::CLabel(const CLabel& L)

クラス自体のコンテキストを見てみると、宣言に明示的なデータメンバーはありません。したがって、私の質問は、データメンバーを含まない参照によって渡されるクラスインスタンスのディープコピーをどのように作成するかということです。

これまでのところ、これが私のクラックです-コンパイルしますが、Visual Studioは例外をキャッチしました-"t1.exeの0x770F380B(ntdll.dll)で未処理の例外:0xC0000374:ヒープが破損しています(パラメーター:0x7710CDD8)。":

*this = L;
 int l = L.width();
 this->_data = new char[l+1];
 int i = 0;
 for(; i < l; i++)
    ((char*)_data)[i] = ((char*)L._data)[i];
 ((char*)_data)[i] = '\0';

テスターファイルの次の行で例外がキャッチされました。

int mesIndx = D.add(new CLabel(7, 5, 40));

この特定の割り当てに関する必要なコンテキストについては、APIのドキュメントはhttp://zenit.senecac.on.ca/wiki/index.php/The_CUI_Framework_-_OOP344_20132#CLabelにあります。

みんな、ありがとう。

4

2 に答える 2

0

先生のコメントは、CLabelのコンテンツをコピーするためにバッファを作成する必要がある場合、最後にそれが破棄されることを確認する必要があるという事実についてだと思います。

例:CLabelに'char *'のようなメンバーとサイズがある場合、新しいバッファー(malloc)を作成する必要があり、削除することを忘れないでください。

より簡単な解決策は、バッファを自動的に管理し、メモリリークを回避して割り当て解除メモリを割り当てるstd::stringメンバーを使用してCLabelクラスを設計することです。

于 2012-11-15T23:16:57.657 に答える
0

そのヘッダーにはコピー コンストラクターが記述されているため、割り当てがそれを実装する場合は、コピー コンストラクターで見つけたドキュメントを参照する必要があります。一般に、これらは C++ でオブジェクトをコピーする正しい方法です。

彼がメモリ リークを防止することによって何を意味するかについては、割り当てについてもっと知る必要があります。コピー コンストラクターの目的は、多くの場合、メモリ リークの反対である二重削除/ダングリング ポインターを防止することです。

于 2012-11-15T23:31:21.850 に答える