2017-10-01 115 views
-2

sage of stackoverflow。問題は、で記述されています。LIST_ENTRYが壊れています(つまり、二重削除)エラーです。しかし、私はどこに間違っているのか分かりません。コンストラクタにメモリを割り当てて、そのメモリを私のデストラクタのオペレータdelete[]で解放しました。これ以上のメモリ除去は起こりません。だから問題は何ですか。 コード:
LIST_ENTRYがC++で破損しています(つまり、ダブル・アンロード)

String():str(NULL), length(0) 
{ 
    str=new char [100]; 
    cout<<"Default constructor has been used"<<endl;} 
String(const char* ko) 
{ 

str=new char [strlen(ko)]; 
strcpy(str,ko); 
cout<<endl; 
length=strlen(ko); 
cout<<"The object is initialized"<<endl; 
} 

String(String &y) 
{ 
    length=y.length; 
    str=new char[length]; 
    strcpy(str,y.str); 
    cout<<endl; 

} 

デストラクタ:

~String() 
{ 
length=0; 
char* spp=str+1; 
delete[] str;/*Here is the point of error(btw if get this operator out the code the programm works fine)*/ 
str=NULL; 
cout<<spp; 
} 
+1

strlen()バイトを割り当ててstrcpy()を使用すると、割り当てられたメモリに1バイト以上書き込んだとします。あなたは壊れたヒープを持っています。 –

答えて

0

strlenので、あなたが割り当て量に1を追加する必要があり、nullターミネータが含まれていません。

str = new char [strlen(ko) + 1];

これをしなければ、 strcpy()は、割り当てられたメモリの最後を書きとめて、そこにあるものを破損します。

+0

別の問題である、それが指すメモリを 'delete'した後に' cout << spp'を呼び出すこともあります。おかげさまで – MrZebra

+0

ありがとうございます。問題がとても分かりやすいとは思わなかった:) –

関連する問題