2016-08-21 6 views
-5

このコードで*dataが使用しているメモリを解放する方法はありますか?新しい[] * charを削除[](ed)できますか?

#include <iostream> 
#include <stdlib.h> 
using namespace std; 

class mstring { 
public: 
    char *data; 
    int length; 

    mstring::mstring() 
{ 
    length = 8; 
    data = new char[length]; 
    data = "UNKNOWN"; 
    cout << "In mstring default ctor" << endl; 
} 

mstring::~mstring() 
{ 
    delete[] data; 
    cout << "In mstring dtor" << endl; 
} 

}; 
int main() { 
    mstring a; 
    cout << a.data; 
} 

"UNKNOWN"として削除しようとするとコードがクラッシュし、削除できません。

+5

あなたはより多くのコンパイラの警告を有効にし、より良い学習教材を取得する必要があります。 –

+7

あなたは 'strcpy()'を使って 'char *'を '削除'しません! (一度、それは言った:_ [私は '' * char 'を単に削除するために '' strcpy'_を使用しなければならないという事実を承知しています) –

+0

'std :: string'を使ってみてください。人生はずっと簡単です – JVApen

答えて

2

あなたの問題は、次のコード内にある:

data = new char[length]; 
data = "UNKNOWN"; 

まず、あなたは新しいチャー配列を作成し、次の文で、あなたはのアドレスでそれをオーバーライドすることで、それだけにアンカーポイントを失います実行可能ファイルの内部に格納されているリテラル文字列 "UNKNOWN"。

デストラクタで終わると、割り当てられたメモリを参照しなくなるので、実行可能ファイルのメモリを削除しようとしています。

あなたがstd::stringstrcpyを使用することはできないので、私はあなたがそれを自分で記述する必要が推測:

auto fixedUnknownString = "UNKNOWN"; 
assert(fixedUnknownString[length] == '\0'); // Lucky coinsidence, extra code required if we wouldn't have an exact match 
for (std::size_t i = 0; i < length; ++i) { 
    data[i] = fixedUnknownString[i]; 
} 
+0

割り当てられたメモリを解放する必要はありませんか?それとも論理的なエラーですか? これは大学の仕事です。この方法では、タスクに応じてデータを初期化することしかできません。 – Akra

+0

はい、割り当てられたメモリを解放する必要がありますが、ポインタを失ってしまったので、もう解放することはできません。 – JVApen

+0

@Akra:論理的なエラーです。 'strcpy()'を使うことができない場合は、 '' UNKNOWN ''(ヌルバイトを含む)のバイトを割り当てられた' 'data''配列に転送するためにシミュレートする必要があります。そして、 'delete [] data;'が動作します。現時点では、(メモリリークのために)割り当てられたもののレコードがないため、削除できません。 –

関連する問題