0

どのコードが良いか(良い場合)

void DeleteObject(Object* obj)
{
    delete obj;
}

また

void DeleteObject(Object** obj)  
{  
    delete *obj;  
}  

int main()  
{  
    Object *obj = new Object();  
    DeleteObject(&obj); or DeleteObject(obj);  
}  

実際DeleteObject、関数はそれほど短くはありません (オブジェクト フィールドを削除します)。

4

4 に答える 4

7

これはいい:

#include <memory>

int main(int argc, char **argv) {  
    std::auto_ptr<Object> ptr = new Object();
}
于 2012-04-23T19:47:47.527 に答える
6

私の意見ではどちらでもない。

オブジェクトを作成した人は、そのオブジェクトに責任があるため、オブジェクトを削除する必要があります。

したがって、私の答えは、それmainを行う必要があるということdeleteです。

于 2012-04-23T19:51:21.020 に答える
1

@nightcracker で提案されているスマート ポインターを使用することもお勧めしますが、本当にそれを望まない場合は、ポインターへの参照をお勧めします。

void DeleteObject(Object* &obj)
{
    delete obj;
    obj = NULL;
}

これにより、元のポインターが null に設定されることが保証されるため、誤ってオブジェクトにアクセスすることはなくなり、参照はポインターへのポインターよりも安全になります。

于 2012-04-23T19:54:24.100 に答える
1

「この関数はオブジェクト フィールドを削除します」とあなたは言いますが、これはもっと恐ろしいことがここで起こっていることを意味するだけです。クラスは、デストラクタとコンストラクタで独自のリソース (サブオブジェクト) を管理する必要があります。外部からいくつかのサブオブジェクトを管理する必要がある場合は、それらを管理するためのパブリック API を提供します。いずれにせよ、生のポインタを使用して寿命を管理するのではなく、スマート ポインタを使用してください (例: std::shared_ptr)。もちろん、いくつかの特殊なケースもありますが、このような質問をしていることを考えると、手元にあるとは思いません。

于 2012-04-23T19:58:20.893 に答える