2012-04-01 14 views
0
class finder 
{ 
    public: 
     finder(); 
     ~finder(); 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    finder* pfind = new finder(L"test"); 
    finder find(L"test2"); 
    system("PAUSE"); 
    return 0; 
} 

findのデストラクタはプログラムの終了後に呼び出されますが、pfindのデストラクタは呼び出されません。私の質問はなぜですか?と私は追加する必要がありますオブジェクトとそのデストラクタへのポインタ

delete _pfind; 

戻る0の前に?

+0

'delete'を追加しないでください。' new'を削除してください。 – avakar

+1

コードにエラーがあります。スニペットを投稿する場合は、スニペットを可能な限り正しいものにするようにしてください。 – meagar

+1

@avakar 'new'と' delete'について学ぶことに何も問題はありません。確かにあなたがそれらを好きでない場合は、それらを避ける方法を見つけることができますが、実際にそれらを使用して、それらと快適になり、あなたの間違いから学び、あなたが好きかどうかを決定する間違ったことは何もありません。 –

答えて

3

「理由」は、作成するオブジェクトの有効期間をnewで管理するためです。

言語では、自動保存期間を持つオブジェクト(例ではfindなど)は、作成されたブロックの長さで保存されます。

動的保存期間オブジェクト(削除するまでは、pfindのようなものです)が最後まで削除されるまで、自動的に削除されます(絶対にブロックしないでください)。あなたのためにそれらを削除するものはありません。

はい、この場合は、自分で削除する必要があります(delete pfind;)。

(またはあなたのユースケースのためのスマートポインタの適切な型を使用します。)

1

はい、あなたは明示的に管理されていないポインタにdeleteを呼び出すことによって、あなたが割り当てたメモリをクリーンアップする必要があります。通常、new経由でメモリを割り当てるコードのブロックは、deleteでそのメモリを割り当て解除するコードブロックと均衡を保つ必要があります。

0

マットは正しいですが、私はあなたがCLR/.Net C++を使用していることに気付きました。これにはというキーワードが付いていると思いますが、newキーワードと同じことをしますが、そのスコープの最後にオブジェクトを削除します。これはガベージコレクションとも呼ばれます。 newgcnewの両方を持つ個人用メモは、両方とも異なる状況にうまく収まるため、優れたツールです。 gcnewを使用する場合、コードはクロスプラットフォームではありませんのでご注意ください。

関連する問題