-3

私はこのクラスを持っています:

class Base{
     private:
        char *message;
     public:
        Base(string message`);
        ~Base();    
};

編集済み:申し訳ありませんが、コンストラクターを提供するのを忘れました!
以下のようにデストラクタを実装すると:

Base::Base(string message1){
     message = new char[message1.size() + 1]
     message[message1.size()] = '\0';
     memcpy(message, message1.c_str(), message.size());
}
Base::~Base(){
     delete message;  
}

時々システムがエラーでうまくいかないことがありstop workingますが、代わりにdelete message、私が使用する場合message = NULL、すべてが大丈夫です!それで、message = NULLデストラクタで宣言しただけの場合、プログラムでメモリリークが発生しますか?

4

7 に答える 7

10

ここで使用する理由はまったくありませんnew。コンストラクターはを受け取り、その内容を動的に割り当てられた新しいの配列に手動でコピーstd::stringますchar。これは完全に無価値です。代わりに、コンストラクターが単にそれを別のコンストラクターにコピーした場合std::stringstd::stringコピーコンストラクターは同じことを行いますが、例外安全性、メモリリークなし適切なコピーセマンティクスなどの多くの無料の利点があります。

class Base{
     private:
        string message;
     public:
        Base(string message);
        // maybe a virtual destructor is desirable if this is a polymorphic base class
        // virtual ~Base() {}
};

Base::Base(string message1) : message(message1) {}
于 2012-06-11T15:46:46.637 に答える
5

問題は、deleteで作成されたもので使用していnew[]ます。delete[] message文字列の割り当てを適切に解除する必要があります。

ポインタをNULLに設定すると、問題がマスクされ、メモリリークします。

于 2012-06-11T15:43:30.233 に答える
2

メモリリークがあります。配列を割り当てるcharので、次のように適切に削除する必要があります。

Base::~Base(){
     delete[] message;  
}

ポインタをNULLに設定した場合は関係ありません。とにかく、デストラクタが呼び出された後、ポインタ自体の割り当てが解除されます。

于 2012-06-11T15:44:48.903 に答える
1

ここに示すコードでは、メモリリークは発生しません。ただし、ポインタに影響NULLを与えても、どのような場合でもポインタは削除されません。あなたはそれへの参照を失うだけです。

于 2012-06-11T15:29:58.483 に答える
1

なぜあなたは使うのdeleteですか?ヒープにメモリを割り当てているのではなく、ポインタを作成しているだけです。ただし、コンストラクターのヒープにメモリを割り当てている場合を除きます。これは、コードを共有しないことを選択したことを考えるとわかりません...

于 2012-06-11T15:33:38.117 に答える
1

はい、コンストラクターでdelete動的に割り当てられたメモリを使用しない場合は、メモリリークになります。new

あなたは使用する必要がありますdelete[] message

于 2012-06-11T15:42:38.383 に答える
1

message = NULLを実行するだけで、ポインタのアドレスを無効にするだけなので、メモリリークが発生します。メモリに保持されていたコンテンツはまだ存在しており、削除されていません。

于 2012-06-11T16:06:59.277 に答える