gpt4 book ai didi

c++ - 使用 shared_ptr 从方法返回指针是否总能避免内存泄漏?

转载 作者:行者123 更新时间:2023-11-30 03:03:49 26 4
gpt4 key购买 nike

我是一个 C++ 新手,我的代码目前在堆上的几个地方都是新的,没有调用 delete。我知道我需要为此做点什么。

我的典型用法是在另一个类成员方法中新建一个类实例,然后该方法返回指向该对象的指针。

如果我将返回类型从 MyType* 更改为 std::tr1::shared_ptr,这会修复我的代码以防止内存泄漏吗?

非常感谢。

编辑:同样,我目前将新创建的对象存储为 MyType* 作为 std:map 中的值。该映射是类实例的私有(private)成员。如果我只是将其更改为 std::tr1::shared_ptr,当它的所有者(类)超出范围时,这会清除这些吗?

再次感谢

最佳答案

当然,这是一个合理的创可贴。

共享指针是一个引用计数 指针。因此,只要存在一个或多个指向某个对象的 shared_ptr,该对象就会保持事件状态。如果您有循环引用,则会出现此问题。那么引用计数将永远不会达到 0,对象将永远不会被删除。

因此 shared_ptr * 仍然* 要求您了解您在做什么并考虑对象所有权,就像您在 C++ 中始终必须做的那样。但它简化了一些复杂的场景,在这些场景中很难确定所有权。

但是真正解决您问题的方法是:

  • 使用 new 最小化分配的数量。对象可以存储在堆栈中吗?是否可以将该对象重写为 RAII 类,以便在堆栈(或具有自动存储持续时间的其他地方)上分配一个小的包装对象,并通过其构造函数和析构函数管理堆分配的内存资源?然后,只要该对象存在,它分配的内存就会被保留,一旦它被销毁,它就会删除它分配的内存。
  • 当您使用new 分配对象时,将它们放在一个 智能指针类中。 shared_ptr 之所以受欢迎,是因为它看起来最像垃圾收集器,但实际上并非如此,如果您将其视为垃圾收集器并以此为借口不考虑内存管理,那就不行了。了解所有智能指针类(C++03 中的 scoped_ptr 和 auto_ptr,或 C++11 中替换两者的 unique_ptr、shared_ptr 和 weak_ptr),并使用最适合您的方案的类。
  • 考虑所有权。任何时候分配内存,都需要确定一个所有者,其生命周期将控制内存分配的生命周期。想想你的分配需要多长的生命周期,并让另一个对象(它的生命周期是自动管理的,可能是因为它在堆栈上)删除你的内存,当它的析构函数被调用时。

没有快速简便的解决方法。 C++中处理内存管理的方法是避免内存管理。将它委托(delegate)给您的对象。如果您在自己的代码中调用 delete,那您就错了。通常,您甚至不需要new,但如果您需要,请立即将所有权分配给智能指针,并让它调用delete你。

根据经验,除非您是库编写者,否则您不应编写newdelete。实际上,您不应该使用原始指针,只有在绝对必要时才使用智能指针。让您的类(class)完成繁重的工作。不要害怕将它们放在堆栈上,按值传递它们,让它们在内部处理它们的资源。

关于c++ - 使用 shared_ptr 从方法返回指针是否总能避免内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9151402/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com