0

さて、私はC ++を初めて使用します。私には Java のバックグラウンドがありますが、C++ を使用すると、自分でガベージ コレクションを行う必要があることがわかります。

これが私のシナリオです:

int main(){
float * pt;
while(true){
 // some code
}
delete pt;
return 0;

無限の while ループの中にいて、ウィンドウの閉じるボタンをクリックしてプログラムを終了するとします。プログラムを閉じるとどうなりますか? while ループを終了してから、delete コマンドを実行しますか? または、削除コマンドを完了せずにプログラムを終了するだけですか。

4

3 に答える 3

5

このような単純なC++プログラムには、「閉じるボタンをクリックする」という概念はありません。GUIツールキットを使い始めるまでは、これに対処することすらありません。このプログラムを終了するさまざまな方法は、実行方法に完全に依存します。ほとんどの場合、何らかのターミナルまたはコマンドラインウィンドウで実行しています。その端末が閉じるボタンを提供している場合、閉じるボタンをクリックすると、実際には端末アプリケーションで何らかのイベントがトリガーされます。まだ実行中のプログラムをどのように処理するかは、完全にそのアプリケーション次第です。多くの場合、端末は子プロセスを強制的に終了します。ただし、これはプラットフォーム固有です。(Linuxの場合、端末が閉じているときにbashが受信するシグナルを参照してください)

deleteプログラムが強制終了された場合にリソースが削除されない可能性があることを心配している場合は、そうしないでください。最新のオペレーティングシステムは、プロセスが終了したときに、プロセスによって割り当てられたリソースをクリーンアップします。

于 2013-02-09T20:50:31.137 に答える
2

ウィンドウがコンソール ウィンドウか通常の UI ウィンドウか、およびオペレーティング システムによって異なります。UI ウィンドウを閉じても、プロセスは実際には終了せず、他のこと (クリーンアップなど) を行う機会があります。コンソール ウィンドウの場合、プロセスは強制的に終了しますが、これは OS に依存します。

いずれにせよ、プロセスがとにかく終了するため、最後に削除コマンドが実行されるかどうかは実際には問題ではなく、プロセスのヒープは、まだ何が残っているかに関係なく完全に再利用されます。

于 2013-02-09T20:54:54.940 に答える
0

sftrabbit が前に言ったように、プロセスを終了するときに、削除について心配する必要はありません。しかし、サインオフ メッセージをサーバーに送信したり、データベースの内容をコミットしたりするなど、もっと複雑なことをしなければならない場合は、atexit() があります。

void mycleanup() {
    // do something here.
    // downside is ofc, that you can only use global stuff ;(
}


int main(){

atexit(mycleanup);

while(true){
 // some code
}

return 0;
于 2013-02-09T21:17:38.957 に答える