C++ 如何检查内存的释放

C++ 如何检查内存的释放,c++,memory-management,C++,Memory Management,如何检查指针p指向的内存是否已成功释放?对不起,非常简短的回答“您不能”简而言之:您不能 查看帮助您调试内存泄漏问题的工具 您还应考虑其他一些事项: 使用智能指针,这样您就不必考虑内存管理 释放指针后,将其设置为0,这样进一步的删除操作将无效 使用标准类(vector,…)而不是自己滚动 最后,不要使用指针(实际上你几乎可以) 使用工具检查内存的正确释放 一些正在进行静态代码分析的工具可以指出一些与内存释放有关的问题 使用valgrind检查是否存在内存泄漏 避免使用原始指针-使用智能指针 定

如何检查指针p指向的内存是否已成功释放?

对不起,非常简短的回答“您不能”

简而言之:您不能

查看帮助您调试内存泄漏问题的工具

您还应考虑其他一些事项:

  • 使用智能指针,这样您就不必考虑内存管理
  • 释放指针后,将其设置为0,这样进一步的
    删除
    操作将无效
  • 使用标准类(
    vector
    ,…)而不是自己滚动
  • 最后,不要使用指针(实际上你几乎可以)
使用工具检查内存的正确释放

  • 一些正在进行静态代码分析的工具可以指出一些与内存释放有关的问题
  • 使用valgrind检查是否存在内存泄漏
  • 避免使用原始指针-使用智能指针

  • 定义成功!定义解除分配

    释放内存(无论是空闲内存还是删除内存)后,不得再次使用该指针。所有其他假设都无关紧要

    毕竟,您可以调用C/C++运行时来释放内存,但C/C++运行时也会调用操作系统的函数来释放页面。您甚至可以在C/C++运行时上有一个自定义内存分配器,例如使用缓存实现更快的内存分配算法


    所有这些层都可能为自己保留解除分配的内存(因为碎片或只是因为他们喜欢自己保留),或者可能会告诉底层解除分配。任何事情都可能发生,只是不再使用那个指针。C++中的

    < P>,你可以安全地假设解除分配永远不会失败。析构函数不能抛出异常,并且实际保留的内存应该永远不会被释放,因此考虑到这两点,没有什么会出错


    但是,如果删除已经删除的指针,程序可能会崩溃。不过,解除分配本身并没有问题-原始的
    delete
    成功运行。如果您的程序尝试删除一个指针两次,那么它的内存管理就会出现问题,但对于现代STL和智能指针(如
    std::vector
    std::unique_ptr
    )等)来说,这几乎是不必要的。即try/catch块。

    需要更多详细信息:最初是如何分配内存的?为什么需要检查它是否已被释放?在应用层,它不能。但是,如果您在一些非常低级别的内核层上工作,可能有办法做到这一点。是的,您试图解决的真正问题是什么?我试图做的是:int*p=::operator new(sizeof(int)*10);删除p;现在我想知道这个mem是否已经被成功释放;您的内存已成功释放。没有其他选择。然而,调用正确的对象析构函数是另一回事。@VJo:你是什么意思<编码>删除p;p=0
    是UB吗?@VJo:如果您只是将指针设置为0,它显然不是UB。@VJo:
    删除p*p=0
    为UB。我的意思不是访问指向内存的变量,而是保存其(现在无效)地址的变量。@VJo:否,不允许将无效指针设置为空指针或另一个有效指针<编码>删除p;p=pp最初不为空,则code>为UB。@VJo:访问指向的值(即取消对已删除指针的引用)为UB。访问指针是完全合法的。不正确;析构函数不能抛出异常,因此这不会起任何作用。