2017-12-27 41 views
3

私は本当に例外が発生したときに、ヒープに割り当てられたメモリと何が起こるかを理解していない:メモリリークはどうなりますか?

#include <iostream> 
#include <vector> 
using namespace std; 

class Base { 
private: 
    int *a; 
public: 
    Base() { 
     // a = new int[100]; 

     throw runtime_error("err"); 
    } 

    ~Base() { 
     // delete[] a; 
    } 
}; 

int main() { 
    std::vector<Base> bases; 
    Base base; 
    bases.push_back(base); 

    std::cout << bases.size() << std::endl; 

    return 0; 
} 

さて、今、それが例外をスローちょうど空のプログラムです。 ヒープにメモリを割り当て、次のプログラム、:

#include <iostream> 
#include <vector> 
using namespace std; 

class Base { 
private: 
    int *a; 
public: 
    Base() { 
     a = new int[100]; 

     throw runtime_error("err"); 
    } 

    ~Base() { 
     // delete[] a; 
    } 
}; 

int main() { 
    std::vector<Base> bases; 
    Base base; 
    bases.push_back(base); 

    std::cout << bases.size() << std::endl; 

    return 0; 
} 

プログラム1:

==14151== HEAP SUMMARY: 
==14151==  in use at exit: 72,876 bytes in 3 blocks 
==14151== total heap usage: 4 allocs, 1 frees, 72,908 bytes allocated 
==14151== 
==14151== Searching for pointers to 3 not-freed blocks 
==14151== Checked 116,088 bytes 
==14151== 
==14151== 144 bytes in 1 blocks are possibly lost in loss record 2 of 3 
==14151== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==14151== by 0x4EC641F: __cxa_allocate_exception (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21) 
==14151== by 0x400F44: Base::Base() (in /home/twite/CLionProjects/oop_learn/driver1) 
==14151== by 0x400E25: main (in /home/twite/CLionProjects/oop_learn/driver1) 
==14151== 
==14151== LEAK SUMMARY: 
==14151== definitely lost: 0 bytes in 0 blocks 
==14151== indirectly lost: 0 bytes in 0 blocks 
==14151==  possibly lost: 144 bytes in 1 blocks 
==14151== still reachable: 72,732 bytes in 2 blocks 

プログラム2:

==14171== HEAP SUMMARY: 
==14171==  in use at exit: 73,276 bytes in 4 blocks 
==14171== total heap usage: 5 allocs, 1 frees, 73,308 bytes allocated 
==14171== 
==14171== Searching for pointers to 4 not-freed blocks 
==14171== Checked 116,096 bytes 
==14171== 
==14171== 144 bytes in 1 blocks are possibly lost in loss record 2 of 4 
==14171== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==14171== by 0x4EC641F: __cxa_allocate_exception (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21) 
==14171== by 0x400F98: Base::Base() (in /home/twite/CLionProjects/oop_learn/driver2) 
==14171== by 0x400E65: main (in /home/twite/CLionProjects/oop_learn/driver2) 
==14171== 
==14171== LEAK SUMMARY: 
==14171== definitely lost: 0 bytes in 0 blocks 
==14171== indirectly lost: 0 bytes in 0 blocks 
==14171==  possibly lost: 144 bytes in 1 blocks 
==14171== still reachable: 73,132 bytes in 3 blocks 

ので、どこメモリリークがですか? Valgrindはメモリリークについて私に教えてくれませんが、私は第2プログラムのものを見ています。

+2

例をコンパイルするときに最適化をオフにして、予期せず最適化されていないことを確認しましたか? – dasblinkenlight

+0

私は次のようにプログラムをコンパイルしました:g ++ -std = C++ 11 -oドライバexample.cppはValgrindを実行しました: valgrind --leak-check = full -v ./example – TwITe

+0

'-O0'(大文字"0"の後に続く)フラグを 'g ++'行に追加し、 'valgrind'をもう一度実行してください。 – dasblinkenlight

答えて

1

プログラムが終了すると、OSは割り当てられたメモリをクリーンアップします。通常は問題ありません。シャットダウン時にメモリリークが発生することはほとんどありません(非常に重要なデストラクタが実行されない場合を除きます)。メモリリークがの場合、の問題は実行時に発生し、プログラムのメモリ使用量が無限大になり(最終的にリソースが枯渇する)問題です。

+0

あなたは、プログラムが終了すると、OSは割り当てられたメモリをすべてクリーンアップすると言いました。しかし、このプログラムはどうですか?https://pastebin.com/3gkhXVYG プログラムは終了しますが、Valgrindはメモリリークを示します。 – TwITe

+1

@TwITe Valgrindはあなた自身がすべてのメモリを解放していないので、リークを示します。したがって、それをOSに残してクリーンアップします。それは技術的に*リークですが、それは重要ではありません。 –

関連する問題