-1

重複の可能性:
ポインタを返した後にヒープを削除する

メンバー関数を持つクラスがあります:

char* toChar();

メンバー関数はメモリを割り当て、そのメモリへのポインタを返します...

私はそれをこのように使うとしましょう:

int main() {
    MyClass mc = new MyClass();
    char* str = mc.toChar();

    return 0; 
}

どこでメモリを解放すればよいですか?クラスのデストラクタまたは次のようなプログラムで:

int main() {
    MyClass * mc = new MyClass();
    char* str = mc.toChar();
    // tostuff with str
    delete mc;
    delete[] str; 

    return 0; 
}
4

3 に答える 3

2

再利用可能にしたい場合(つまり、複数回呼び出すことができ、クラスが変更されたためなど、異なる値が返される場合があります)、メインで解放する必要があります。そうでなければ、それはあなた次第です。

ただし、一般的に、プレーンな文字列は使用しないでください。使用するように変更してからstd::string、値で返す必要があります。

于 2012-09-19T08:38:45.827 に答える
1

メンバー関数は、メモリを管理するオブジェクトを返す必要があります。通常はそうstd::unique_ptrですが、charデータのstd::string場合は次の方が適切な場合があります。

class MyClass {
    ...
    std::string toChar();
};

int main() {
    MyClass mc;
    std::string str = mc.toChar();
}

mc管理対象オブジェクト(ここではスタック上で直接管理されます。これも機能しますが、ほとんど不要です)を作成することにより、コードのどこにも表示するunique_ptr必要がないことに注意してください。delete一般に、独自のコンテナーを作成している場合を除きdelete、コードに表示されるべきではありません。

于 2012-09-19T08:45:01.180 に答える
0

問題は、strが指し示すその記憶の「所有者」が誰であるかということです。mcはconstchar*ではなくchar*を返すため、クライアント(str)が文字列の値を変更できるようになるため、strも結果的にメモリの解放を処理する必要があります。mcがメモリを解放しても、strがメモリにアクセスしたい場合はどうなりますか?プロセスは終了します。

于 2012-09-19T09:07:26.637 に答える