このクラスに違いはありますか::
class Osoba{
public:
char* imie;
int wiek;
Osoba(char* imie, int wiek){
this->imie = imie;
this->wiek = wiek;
}
};
デストラクタなし~Osoba(){delete imie;}
で、またはそれで?どちらの場合も正しいですか?
このクラスに違いはありますか::
class Osoba{
public:
char* imie;
int wiek;
Osoba(char* imie, int wiek){
this->imie = imie;
this->wiek = wiek;
}
};
デストラクタなし~Osoba(){delete imie;}
で、またはそれで?どちらの場合も正しいですか?
重要な違いがあります。
コンストラクターから取得しているchar* imie
ため (そうしなかったことを意味しますnew
)、そうすべきではありませんdelete
。delete *imie;
何をしているのかわからない限り、使用しないでください。
new
ポインタが担当するクラス/オブジェクトはdelete
、この方法でコードを編成します。
いいえ、どのように作成されたかわからないため、削除imie
しないでください。Osoba
Osoba
imie
一般に、メモリーの解放は、メモリーを割り当てた人の責任です。あなたの場合、コンストラクターを呼び出す人は誰でも最初Osoba(char* imie, int wiek)
に作成する必要があります。imie
これは、new、malloc、strdup、またはメモリを割り当てるその他のものを使用して行うことができます。ヒープから割り当てられていないものでさえあるかもしれません。
ポイントは、Osoba
は について何も知らないimie
ので、おそらく削除しない方がよいということです。割り当てた人imie
はそれを削除する必要があります。
実際、おそらく文字列をコピーOsoba
する必要があります。
this->imie = strdup(imie)
その場合free(imie)
、デストラクタで行う必要があります。おそらく文字列をコピーする必要があるのは、呼び出し元が次のようなことをした可能性があるためです。
Osoba* SomeFunction()
{
char X[100];
sprintf(X, "I will be gone when SomeFunction returns");
return new Osoba(X, 0);
}
この場合、SomeFunction が戻ると X はなくなり、Osoba はランダム メモリへのポインタを持つことになります。
しかし、あなたの質問に答えるには、いいえ、作成方法がわからないため、削除imie
しないでください。コピーすることにしない限り、その場合はデストラクタでコピーを解放する必要があります。Osoba
Osoba
imie
Osoba
違いは、最初のケースでは、 anの寿命が来ても特別なことは何も起こらないということです。2 番目のケースでは、 delete を で呼び出しますがimie
、これは正しいことである場合とそうでない場合があります。
何が正しいかOsoba
は、 がオブジェクト ポインター広告を所有することになっているかどうかによって異なりますimie
。そうでない場合は、ユーザー定義のデストラクタは必要ありません。その場合は、デストラクタに代入演算子とコピー コンストラクタを追加するか、両方を無効にする必要があります。この理由は、代入とコピーを大文字と小文字を区別して扱わないと、多くのインスタンスが同じオブジェクトを指すことになる可能性があるためです。これらのインスタンスはすべて、同じオブジェクトを削除しようとします。3 のルールを参照してください。