1

このクラスに違いはありますか::

class Osoba{
public:
char* imie;
int wiek;

Osoba(char* imie, int wiek){
    this->imie = imie;
    this->wiek = wiek;
}
};

デストラクタなし~Osoba(){delete imie;}で、またはそれで?どちらの場合も正しいですか?

4

3 に答える 3

2

重要な違いがあります。

コンストラクターから取得しているchar* imieため (そうしなかったことを意味しますnew)、そうすべきではありませんdeletedelete *imie;何をしているのかわからない限り、使用しないでください。

newポインタが担当するクラス/オブジェクトはdelete、この方法でコードを編成します。

于 2013-05-19T11:16:38.883 に答える
1

いいえ、どのように作成されたかわからないため、削除imieしないでください。OsobaOsobaimie

一般に、メモリーの解放は、メモリーを割り当てた人の責任です。あなたの場合、コンストラクターを呼び出す人は誰でも最初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しないでください。コピーすることにしない限り、その場合はデストラクタでコピーを解放する必要があります。OsobaOsobaimie

于 2013-05-19T12:30:38.447 に答える
1

Osoba違いは、最初のケースでは、 anの寿命が来ても特別なことは何も起こらないということです。2 番目のケースでは、 delete を で呼び出しますがimie、これは正しいことである場合とそうでない場合があります。

何が正しいかOsobaは、 がオブジェクト ポインター広告を所有することになっているかどうかによって異なりますimie。そうでない場合は、ユーザー定義のデストラクタは必要ありません。その場合は、デストラクタに代入演算子とコピー コンストラクタを追加するか、両方を無効にする必要があります。この理由は、代入とコピーを大文字と小文字を区別して扱わないと、多くのインスタンスが同じオブジェクトを指すことになる可能性があるためです。これらのインスタンスはすべて、同じオブジェクトを削除しようとします。3 のルールを参照してください。

于 2013-05-19T11:16:50.970 に答える