为何不要构造一个临时的shared_ptr作为函数参数

原创 2011年01月11日 12:02:00

我遇到的时在构造函数的参数传送了一个 A(shared_ptr<>) ... 结果导致内存泄漏。

 

后来跟朋友交流了一下,朋友说文档里有说明 ,我至今还没查文档呢。

 

引擎了一下发现,有人遇到过类似的问题,在此记录一下

 

 

以下是我查到的内容:

http://bbs.chinaunix.net/archiver/?tid-1834186.html

 

为何不要构造一个临时的shared_ptr作为函数参数

[i=s] 本帖最后由 xyfree 于 2010-12-20 10:04 编辑 [/i]

以下是网上找来的一个说法,请大牛说说是否正确,并解释原因

-----------------------------------------

不要构造一个临时的shared_ptr作为函数的参数。
如下列代码则可能导致内存泄漏:[code]
void test() {
    foo( boost::shared_ptr<implementation>( new implementation() ), g() );
}
[/code]正确的用法为:[code]
void test(){
    boost::shared_ptr<implementation> sp ( new implementation() );
    foo(sp,g());
}
[/code]如果真的会导致 shared_ptr 没有正确的析构的话,
我没有想明白编译器背后会做什么事情,使得两段程序的语义会有所不同。

 

OwnWaterloo 发表于 2010-12-19 21:42

我记错了 ……

是在effc++ 3rd item17 Store newed objects in smart pointers in standalone statements.

 

相关文章推荐

boost::shared_ptr:传值还是传引用?

关于shared_ptr shared_ptr,顾名思义,是共享指针。boost库引入shared_ptr为了实现在C++中通过引用计数对堆对象进行内存管理的一种机制。更多关于shared_pt...

C++11中shared_ptr的使用

C++11中shared_ptr的使用

shared_ptr

shared_ptr是一个最像指针的"智能指针",是boost.smart_ptr库中最有价值、最重要的组成部分,也是最有用的,Boost库的许多组件--甚至还包括其他一些领域的智能指针都使用了sha...
  • sndaxdrs
  • sndaxdrs
  • 2011年02月09日 16:22
  • 68049

shared_ptr(共享指针)使用总结

背景介绍         最近在coding的时候遇到这样的问题,一个两层的map,hashmap>,重新加载时需要将这个map释放,但是这个map使用时是分为两段使用,一段是在hashmap中...

【C++11新特性】 C++11智能指针之shared_ptr

C++中的智能指针首先出现在“准”标准库boost中。随着使用的人越来越多,为了让开发人员更方便、更安全的使用动态内存,C++11也引入了智能指针来管理动态对象。在新标准中,主要提供了shared_p...

shared_ptr的理解和注意事项

昨天把shared_ptr的源码分析了一遍,也看了一些有关shared_ptr分析的文章,今天自己来总结一下。  以独立语句将newed对象置入智能指针对于下面这样一个使用智能指针的函数调用,可能会...

关于shared_ptr 的一些探索

很多年没有做过C++项目了,最近买了中文版的STL 标准模板库第二版,准备花些时间了解一下C++11的最新内容。完整的阅读了Smart Pointer 的内容之后,想写几个例子熟悉一下Shared_p...

智能指针作为函数参数:普通参数、指针参数、WPARAM

一、auto_ptr和shared_ptr作为普通参数、指针参数         我想这是我们使用最多的,直接传过去好了,基本上没什么好担心的。例如:         1.         T*...
  • Alsmile
  • Alsmile
  • 2013年04月27日 14:26
  • 2237

强大的c/c++测试工具--lint简介

lint是最著名的C语言工具之一,是由贝尔实验室SteveJohnson于1979在PCC(PortableC Compiler)基础上开发的静态代码分析,一般由UNIX系统提供。 中文名l...

GDB观察栈的内存布局

进程的内存布局如下图所示,栈是其中一块向下(低地址处)增长的内存。  栈的英文是stack,堆的英文是heap,很多人把stact翻译成堆栈,是不对的。              ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:为何不要构造一个临时的shared_ptr作为函数参数
举报原因:
原因补充:

(最多只允许输入30个字)