Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止内存泄漏? 最近我采访了一个C++的位置,我被问到如何防止内存泄漏。我知道我没有给那个问题一个满意的答案,所以我把它扔给你们。防止内存泄漏的最佳方法是什么_C++_Memory Management_Pointers_Memory Leaks - Fatal编程技术网

如何防止内存泄漏? 最近我采访了一个C++的位置,我被问到如何防止内存泄漏。我知道我没有给那个问题一个满意的答案,所以我把它扔给你们。防止内存泄漏的最佳方法是什么

如何防止内存泄漏? 最近我采访了一个C++的位置,我被问到如何防止内存泄漏。我知道我没有给那个问题一个满意的答案,所以我把它扔给你们。防止内存泄漏的最佳方法是什么,c++,memory-management,pointers,memory-leaks,C++,Memory Management,Pointers,Memory Leaks,谢谢 使用各种智能指针 使用某些策略来创建和删除对象,例如谁创建了负责删除的对象。将新对象替换为共享对象。基本上是雷伊。确保代码异常安全。尽可能地使用stl。如果使用引用计数指针,请确保它们不会形成循环。boost的作用域_退出也非常有用 我从以下内容开始:一个非常好的方法是使用智能指针,boost/tr1::shared\u ptr。一旦(堆栈分配的)智能指针超出范围,内存将被释放。 聪明的指针 内存管理 覆盖“新建”和“删除”或使用您自己的宏/模板 (Easy)永远不要让原始指针拥有对象(

谢谢

使用各种智能指针


使用某些策略来创建和删除对象,例如谁创建了负责删除的对象。

将新对象替换为共享对象。基本上是雷伊。确保代码异常安全。尽可能地使用stl。如果使用引用计数指针,请确保它们不会形成循环。boost的作用域_退出也非常有用

我从以下内容开始:

一个非常好的方法是使用智能指针,boost/tr1::shared\u ptr。一旦(堆栈分配的)智能指针超出范围,内存将被释放。

  • 聪明的指针
  • 内存管理
  • 覆盖“新建”和“删除”或使用您自己的宏/模板
  • Easy)永远不要让原始指针拥有对象(在代码中搜索regexp
    “\=*new”
    。请改用shared\u ptr或scoped\u ptr,甚至更好,尽可能多地使用实变量而不是指针

  • Hard)确保没有任何循环引用,共享的\u ptr相互指向,使用弱\u ptr将其打断

  • 完成了

  • 如果不需要,不要在堆上分配内存。大多数工作都可以在堆栈上完成,因此您应该只在绝对需要时才进行堆内存分配

  • 如果需要由单个其他对象拥有的堆分配对象,则使用
    std::auto_ptr

  • 使用标准容器,或者Boost的容器,而不是自己发明

  • 如果您有一个被多个其他对象引用的对象,并且没有一个特定的对象拥有,那么请使用
    std::tr1::shared_ptr
    std::tr1::weak_ptr
    ——以适合您的用例为准

  • 如果这些东西都不符合您的用例,那么可以使用
    delete
    。如果您最终不得不手动管理内存,那么只需使用内存泄漏检测工具来确保您没有泄漏任何东西(当然,要小心)。不过,您不应该真正做到这一点


  • 在x86上,您可以定期使用Valgrind检查代码

    您最好仔细阅读。

    • 确保每次创建对象时都能准确地理解对象将如何被删除
    • 每次指针返回给您时,请确保您了解指针的所有者
    • 确保您的错误路径正确地处理了您创建的对象
    • 对上述情况心存疑虑

    到目前为止给出的所有答案归结为:避免调用
    删除

    任何时候程序员必须调用
    delete
    ,都有潜在的内存泄漏。 相反,使<代码>删除>代码>自动发生。C++保证当它们超出范围时,本地对象有调用它们的析构函数。使用该保证,确保您的内存分配被自动删除。

    一般来说,这种技术意味着每个内存分配都应该包装在一个简单的类中,该类的构造函数分配必要的内存,析构函数释放它

    由于这是一种常用且广泛适用的技术,因此创建了智能指针类,以减少样板代码的数量。它们的构造函数不分配内存,而是将指向已分配内存的指针存储起来。当智能指针超出范围时,它能够删除所有阳离子

    当然,根据使用情况,可能需要不同的语义。您是否只需要一个简单的情况,即分配应该持续到包装类存在的时间?然后使用
    boost::scoped_ptr
    ,或者,如果您不能使用boost,
    std::auto_ptr
    。是否有未知数量的对象引用分配如果不知道他们每个人能活多久,那么参考计数
    boost::shared\u ptr
    是一个很好的解决方案

    但是你不必使用智能指针。标准的库容器也可以做到这一点。它们在内部分配存储你放入其中的对象副本所需的内存,并且在删除它们时再次释放内存。因此用户不必调用
    new
    delete

    这种技术有无数种变体,它们改变了创建初始内存分配的责任,或者应该在何时执行释放

    但是它们的共同点是对你的问题的答案:RAII习语:资源获取是初始化。内存分配是一种资源。资源应该在对象初始化时获取,在对象销毁时由对象释放

    使C++范围和生存规则为您工作。在RAII对象之外,永远不要调用<代码>删除>代码>,它是容器类、智能指针或单个分配的特定自组织包装器。让对象处理分配给它的资源。< /P>


    如果所有的
    delete
    调用都是自动发生的,那么你就无法忘记它们。而且你也无法泄漏内存。

    除了关于RAII的建议之外,如果有任何虚拟函数,请记住将基类析构函数设为虚拟。

    为了避免内存泄漏,你必须做的是有一个明确的定义谁负责删除任何动态分配的对象的概念

    C++允许在堆栈上构造对象(即作为一种局部变量)