私がこれを持っている場合:
double foo()
{
double* ptr = new double(0);
return *ptr;
}
戻る前に ptr を削除しないと、メモリ リークが発生しますか? したがって、関数から戻る前に ptr を削除する正しい方法は何ですか?
私がこれを持っている場合:
double foo()
{
double* ptr = new double(0);
return *ptr;
}
戻る前に ptr を削除しないと、メモリ リークが発生しますか? したがって、関数から戻る前に ptr を削除する正しい方法は何ですか?
いくつかの解決策があります:
オブジェクト (値ではなく) を関数のスコープ外に存在させたくない場合は、オブジェクトを動的に割り当てることはあまり意味がありません。
スタックに割り当てるだけです:
double foo() {
double d = 0;
...
return d;
}
別の方法は、関数のスコープを超えてオブジェクトを存在させることです。この場合、オブジェクトを返す前に削除したくありません。これを管理する最善の方法は、ある種のスマート ポインターを使用することです (これにより、ほとんどの場合、メモリ管理が自動的に処理されます)。
なぜ動的にdoubleを割り当てるのですか?私は意味のある文脈を考えることができませんnew double
。double
をローカル変数として宣言するだけです。
関数の終わりで存続期間が終了するオブジェクトを動的に割り当てたいのは、ポリモーフィズムが関係している場合だけです。そのような場合は、を使用できますstd::auto_ptr
(または
std::unique_ptr
、表示されるすべてのコンパイラがC ++ 11をサポートすることが確実な場合)。
が指す値を返す場合、関数を終了する前にそれを削除したくないptr
ことは間違いありません。削除してから返すと、呼び出し元の関数は解放されたメモリにアクセスしようとしますが、これは禁止されています。
関数を呼び出しているのと同じクラスのポインターで foo() の戻り値を受け取る限り、問題ありません。その後、不要になったときにそのポインターで削除を使用できます...