私は本当に例外が発生したときに、ヒープに割り当てられたメモリと何が起こるかを理解していない:メモリリークはどうなりますか?
#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プログラムのものを見ています。
例をコンパイルするときに最適化をオフにして、予期せず最適化されていないことを確認しましたか? – dasblinkenlight
私は次のようにプログラムをコンパイルしました:g ++ -std = C++ 11 -oドライバexample.cppはValgrindを実行しました: valgrind --leak-check = full -v ./example – TwITe
'-O0'(大文字"0"の後に続く)フラグを 'g ++'行に追加し、 'valgrind'をもう一度実行してください。 – dasblinkenlight