Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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
使用shared_ptr从方法返回指针是否总能避免内存泄漏? 我是C++新手,我的代码当前在堆上堆了几个地方,不调用删除。我知道我需要做点什么_C++ - Fatal编程技术网

使用shared_ptr从方法返回指针是否总能避免内存泄漏? 我是C++新手,我的代码当前在堆上堆了几个地方,不调用删除。我知道我需要做点什么

使用shared_ptr从方法返回指针是否总能避免内存泄漏? 我是C++新手,我的代码当前在堆上堆了几个地方,不调用删除。我知道我需要做点什么,c++,C++,我的典型用法是在另一个类成员方法中创建一个类实例,然后该方法返回指向该对象的指针 如果我将返回类型从MyType*更改为std::tr1::shared\u ptr,这会修复我的代码以避免内存泄漏吗 非常感谢 编辑: 同样,我目前将新的对象存储为MyType*,作为std:map中的一个值。此映射是类实例的私有成员。如果我简单地将其更改为std::tr1::shared\u ptr,那么当其所有者(类)不在范围内时,它会清除这些吗 再次感谢只要您了解tr1共享指针是如何工作的,是的 查看Booo

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

如果我将返回类型从MyType*更改为std::tr1::shared\u ptr,这会修复我的代码以避免内存泄漏吗

非常感谢

编辑: 同样,我目前将新的对象存储为MyType*,作为std:map中的一个值。此映射是类实例的私有成员。如果我简单地将其更改为std::tr1::shared\u ptr,那么当其所有者(类)不在范围内时,它会清除这些吗


再次感谢

只要您了解tr1共享指针是如何工作的,是的


查看Booost C++ + SyrdY-PTR也可能是你想要的更多。

< P>这是一个合理的创可贴,当然。 共享指针是引用计数指针。因此,只要存在一个或多个指向某个对象的
shared_ptr
s,该对象将保持活动状态。如果有循环引用,则会出现问题。然后引用计数将永远不会达到0,并且对象将永远不会被删除

<> >代码> SyddypTr> /Cux>*仍然要求您理解您正在做的事情,并考虑对象所有权,因为您必须在C++中完成。但它简化了其他一些复杂场景,在这些场景中,很难确定所有权

但解决问题的真正办法是:

  • 使用
    new
    最小化分配的数量。是否可以将对象存储在堆栈上?是否可以将对象重写为RAII类,以便在堆栈上(或具有自动存储持续时间的其他位置)分配一个小包装器对象,并且该对象通过其构造函数和析构函数管理堆分配的内存资源?然后,只要该对象存在,它分配的内存就会被保留,一旦它被销毁,它就会删除它分配的内存
  • 使用
    new
    分配对象时,请将它们放在一个智能指针类中
    shared_ptr
    很受欢迎,因为它看起来最像垃圾收集器,但它不是,如果你把它当作一个垃圾收集器,并以此为借口不考虑内存管理,那么它就不起作用了。了解所有智能指针类(C++03中的作用域\u ptr和自动\u ptr,或C++11中的唯一\u ptr和共享\u ptr和弱\u ptr),并使用最适合您的场景的类
  • 想想所有权。无论何时分配内存,都需要确定所有者,其生存期将控制内存分配的生存期。考虑一下您的分配需要多长时间的生存期,并在调用其析构函数时使用另一个对象(其生存期是自动管理的,可能是因为它在堆栈上)
    delete
    您的内存
没有快速简单的解决方法。在C++中处理内存管理的方法是避免内存管理。将其委托给对象。如果您在自己的代码中调用
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“更符合他的需求”?为什么暗示他需要理解共享指针是如何工作的,而不是实际解释它?共享指针可以解决问题,不管你是否理解它们,当你理解它们时,它们不会神奇地开始工作;它们应该被理解,所以有些