2017-09-20 1 views
0

、私はいくつかのテストを行った:std :: exitリークメモリを使用できますか?私の質問に答えるために

(以下を複製することは必要である含まれます)

#include <cstdlib> 
#include <memory> 

私はmain機能でstd::unique_ptrで、std::exitと呼ばれる機能を作りました。

void some_function() 
{ 
    std::exit(EXIT_SUCCESS); 
} 

int main() 
{ 
    std::unique_ptr<int> relying_on_raii{new int{5}}; 
} 

私はunique_ptr宣言の後some_functionと呼ばれる場合は、メモリがリークする可能性があります。

1 potential leak(s) (suspected false positives) 
     […] 
    6 unique,  6 total, 797 byte(s) of still-reachable allocation(s) 

対としては第7電位漏れが発生した第二の例では、見ることができ、

1 potential leak(s) (suspected false positives) 
     […] 
    7 unique,  7 total, 801 byte(s) of still-reachable allocation(s) 
た:

2つのログは、私は、次の行が異なっDr. Memoryから得4バイトのサイズ。これはちょうどintのサイズです。私はこのテストを二重で繰り返したが、実際にはでテストで805 byte(s)となった。

安全な機能を使用する場合はstd::exitですか、またはメモリリークを防ぐために常にメインから戻す必要がありますか?

+0

あなたが 'exit'を呼んでいるのであれば、依然として漏れは大きな懸念ですか?スタックが巻き戻されるのを気にするならば。 'main'だけがキャッチできる例外を投げます。 – StoryTeller

+0

@StoryTeller私はプログラムを終了する通常の方法としてstd :: exitを使いたいと思っています。戻り値を3回呼び出し、bool値のチェックをして、再実行するかどうかを判断するのは 'std: :exit'。 'スロー'は面白い考えですが、成功した出口を捨てるためのハックのように思えます。 – kim366

+0

プログラムが終了したら、何が漏れていますか? OSがプロセスをクリーンアップします。 – NathanOliver

答えて

1

std :: exitは安全機能を使用していますか、またはメモリリークを防ぐためにメインから常に戻す必要がありますか?

はい、メモリがリークする可能性があります。

それほど問題はありません。より重要な問題は、プログラムがプロセスをシャットダウンして解放できないリソースを取得した場合です。このようなケースを処理するには、mainを終了するか、try-throw-catchを使用してmainがすべてのキャッチされていない例外をキャッチして正常に終了できるようになるまで、何らかのエラー状態で戻ってください。

関連する問題