内存泄漏会发生什么?

我真不明白,当异常发生在堆与分配的内存会发生什么:内存泄漏会发生什么?

#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没有告诉我有关内存泄漏的情况,但是我看到了第二个程序中的那个。

回答:

当程序终止时,操作系统清理它分配的任何内存 - 通常不是问题。内存泄漏在关机时很少成为问题(除非一些重要的析构函数没有机会运行)。如果内存泄漏是真正的问题,那么当它们在运行时发生并导致程序内存使用增长无限(最终导致资源耗尽)时。

以上是 内存泄漏会发生什么? 的全部内容, 来源链接: utcz.com/qa/266721.html

回到顶部