内存泄漏是如何发生的

How does the memory leak happen?

本文关键字:何发生 泄漏 内存      更新时间:2023-10-16

下面是代码,该程序导致内存泄漏。我不知道这是怎么发生的?

#include <iostream>
#include <memory>
#include <stdexcept>
using namespace std;
void test(shared_ptr<string> &ptr, int num) {
    cout << "pass test:" << *ptr << " " << num << endl;
}
int fun() {
    throw new runtime_error("runtime error");
    return 0;
}
int main() {
    try {
      //  test(static_cast<shared_ptr<string> >(new string("hello")), fun());
      //  Solution
      shared_ptr<string> sps(new string("h"));
      test (sps, fun());
    } catch (runtime_error *e) {
        cout << e->what() << endl;
    }
    return 0;
}

我使用valgrind来测试内存泄漏

==4726== 
==4726== HEAP SUMMARY:
==4726==     in use at exit: 54 bytes in 2 blocks
==4726==   total heap usage: 6 allocs, 4 frees, 248 bytes allocated
==4726== 
==4726== LEAK SUMMARY:
==4726==    definitely lost: 16 bytes in 1 blocks
==4726==    indirectly lost: 38 bytes in 1 blocks
==4726==      possibly lost: 0 bytes in 0 blocks
==4726==    still reachable: 0 bytes in 0 blocks
==4726==         suppressed: 0 bytes in 0 blocks
==4726== Rerun with --leak-check=full to see details of leaked memory
==4726== 
==4726== For counts of detected and suppressed errors, rerun with: -v
==4726== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)

我认为当fun()引起异常时,sps会自我删除。更重要的是,test()中对shared_ptr的引用将不会分配内存。

智能指针的行为很奇怪

例外是您的泄漏。您正在实例化它,而不是删除它。看这个

相关文章: