使用shared_ptr从方法返回指针是否总能避免内存泄漏? 我是C++新手,我的代码当前在堆上堆了几个地方,不调用删除。我知道我需要做点什么
我的典型用法是在另一个类成员方法中创建一个类实例,然后该方法返回指向该对象的指针 如果我将返回类型从MyType*更改为std::tr1::shared\u ptr,这会修复我的代码以避免内存泄漏吗 非常感谢 编辑: 同样,我目前将新的对象存储为MyType*,作为std:map中的一个值。此映射是类实例的私有成员。如果我简单地将其更改为std::tr1::shared\u ptr,那么当其所有者(类)不在范围内时,它会清除这些吗使用shared_ptr从方法返回指针是否总能避免内存泄漏? 我是C++新手,我的代码当前在堆上堆了几个地方,不调用删除。我知道我需要做点什么,c++,C++,我的典型用法是在另一个类成员方法中创建一个类实例,然后该方法返回指向该对象的指针 如果我将返回类型从MyType*更改为std::tr1::shared\u ptr,这会修复我的代码以避免内存泄漏吗 非常感谢 编辑: 同样,我目前将新的对象存储为MyType*,作为std:map中的一个值。此映射是类实例的私有成员。如果我简单地将其更改为std::tr1::shared\u ptr,那么当其所有者(类)不在范围内时,它会清除这些吗 再次感谢只要您了解tr1共享指针是如何工作的,是的 查看Booo
再次感谢只要您了解tr1共享指针是如何工作的,是的
查看Booost C++ + SyrdY-PTR也可能是你想要的更多。
< P>这是一个合理的创可贴,当然。 共享指针是引用计数指针。因此,只要存在一个或多个指向某个对象的shared_ptr
s,该对象将保持活动状态。如果有循环引用,则会出现问题。然后引用计数将永远不会达到0,并且对象将永远不会被删除
<> >代码> SyddypTr> /Cux>*仍然要求您理解您正在做的事情,并考虑对象所有权,因为您必须在C++中完成。但它简化了其他一些复杂场景,在这些场景中,很难确定所有权
但解决问题的真正办法是:
- 使用
最小化分配的数量。是否可以将对象存储在堆栈上?是否可以将对象重写为RAII类,以便在堆栈上(或具有自动存储持续时间的其他位置)分配一个小包装器对象,并且该对象通过其构造函数和析构函数管理堆分配的内存资源?然后,只要该对象存在,它分配的内存就会被保留,一旦它被销毁,它就会删除它分配的内存new
- 使用
分配对象时,请将它们放在一个智能指针类中new
很受欢迎,因为它看起来最像垃圾收集器,但它不是,如果你把它当作一个垃圾收集器,并以此为借口不考虑内存管理,那么它就不起作用了。了解所有智能指针类(C++03中的作用域\u ptr和自动\u ptr,或C++11中的唯一\u ptr和共享\u ptr和弱\u ptr),并使用最适合您的场景的类shared_ptr
- 想想所有权。无论何时分配内存,都需要确定所有者,其生存期将控制内存分配的生存期。考虑一下您的分配需要多长时间的生存期,并在调用其析构函数时使用另一个对象(其生存期是自动管理的,可能是因为它在堆栈上)
您的内存delete
delete
,则说明您做错了。通常,您甚至不需要new
,但如果需要,请立即将所有权分配给智能指针,并允许调用delete
根据经验,除非你是图书馆的作者,否则你不应该写
new
或delete
。实际上,您不应该使用原始指针,只有在绝对必要时,才应该使用智能指针。让你的班级来做繁重的工作。不要害怕把它们放在堆栈上,通过值传递它们,并让它们在内部处理资源。 < P>如果你是C++新手,那么不管你是否使用SydDypPTR,都有一些指针管理需要理解和接受。p>
< >在使用C++时,您可能需要使用新的并将其返回指针赋给已声明的类指针。我相信花点时间去理解那里发生了什么是明智的,即使你写了一个小的测试程序,并且看着构造函数在调试器中执行
如果您使用像std::string这样的类,它的构造函数和析构函数将为您执行字符串指针管理,但是我相信,如果仅仅阅读文档,了解该类的幕后情况是一个好主意
另一个例子是,如果没有对API的大量详细阅读,就不能使用某些类,否则会出现问题。几年前,我曾在一家使用商业级软件包的公司工作。有人用这个包的线程池类编写了一个多线程程序
文档中明确指出,不能只带着未完成的线程退出。然而,我看到程序的作者在退出时没有费心同步和关闭所有线程,并且在程序退出时抛出异常。这是一个商业金融产品
我的建议是不要指望从执行指针管理中得救。有一些std课程,比如string,可以减轻你的头痛,但是,除了你自己的勤奋和测试之外,没有什么能阻止其他问题。如果你一直在编写代码,而不关心内存管理,那么你可能会遇到比泄露更大的问题。这是我第一次写C++,给我一点回旋余地。也许你会展示一个例子,你将在哪里使用<代码> SydDyPosith?1:为什么Boost的shared_ptr比
tr1
或std
shared_ptr“更符合他的需求”?为什么暗示他需要理解共享指针是如何工作的,而不是实际解释它?共享指针可以解决问题,不管你是否理解它们,当你理解它们时,它们不会神奇地开始工作;它们应该被理解,所以有些