智能指针变量做函数参数的一个值得注意的地方
2012-03-23 23:25
253 查看
作者:朱金灿
来源:http://blog.csdn.net/clever101
先考考大家,下面一段程序,会有什么问题:
下午同事就遇到上面一段程序类似的问题,他不明白程序为何会在pNewInstance->ChangeName();这一句崩溃。当时我也不是很确定,就这样分析:智能指针变量boost::shared_ptr<MyClass>ptrParam作为一个局部变量,当离开其作用域时,估计是执行了MyClass析构函数。
晚上回来查了下资料,比较标准的解释是:智能指针自动地增加和减少它指向对象的引用计数,当对象引用计数减少到0的时候自动摧毁。如果一个函数使用智能指针作为参数,那么不要把一个没有被其他智能指针引用的对象常规指针作为参数传入到函数中。如果这样做,那么这个对象指针将会被摧毁掉。接下来是这个问题详细描述:
1 常规指针pkObject指向一个动态分配的对象,其引用计数为0。
2 传输pkObject到一个智能指针参数,编译器隐式调用智能指针的构造函数将pkObject转换到一个临时的智能指针,并将对象的引用计数增加到1。
3 在函数调用的作用域,这个临时智能指针通过调用智能指针的拷贝构造函数复制到一个局部智能指针中,并将对象的引用计数增加到2。
4 当函数调用返回的时候,局部智能指针被摧毁,并将对象的引用计数减少到1。
5 在调用完成的时候,临时智能指针对象也被摧毁,并将对象的引用计数减少到0,这导致对象被释放掉。
参考文献:
1.智能指针
如果你觉得我的博客对你有帮助,请在下面网址中博客之星评选活动投我一票:
http://vote.blog.csdn.net/item/blogstar/clever101(单击候选人介绍下面的投他一票那个按钮)
参与投票有机会获奖:
最佳贡献奖:通过微博分享活动就有机会获得30元充值卡一张(每周抽选5名)
幸运奖:凡参与投票用户就有机会获得精美小礼品一份。(每周抽选5名)
积极参与奖:所有参与投票并符合条件的用户均可获得20个下载积分。
来源:http://blog.csdn.net/clever101
先考考大家,下面一段程序,会有什么问题:
#include <iostream> #include <string> #include "boost/smart_ptr.hpp" class MyClass { public: MyClass() { m_count = 1; m_strName = _T("xiao ming"); } void Increase() { m_count++; std::wcout<<m_strName<<_T(" increase 1 ")<<std::endl; } void ChangeName() { m_strName = _T("xiao gang"); std::wcout<<_T("The new name is ")<<m_strName<<std::endl; } std::wstring GetName() { return m_strName; } ~MyClass() { std::wcout<<_T(" Destructor")<<std::endl; } private: int m_count; std::wstring m_strName; }; void Process(boost::shared_ptr<MyClass>& ptrParam) { ptrParam->Increase(); std::wcout<<ptrParam->GetName()<<_T(" enter Procees function")<<std::endl; } void CallFunction() { MyClass* pNewInstance = new MyClass(); { boost::shared_ptr<MyClass> ptrParam(pNewInstance); Process(ptrParam); } pNewInstance->ChangeName(); } int _tmain(int argc, _TCHAR* argv[]) { CallFunction(); system("pause"); return 0; }
下午同事就遇到上面一段程序类似的问题,他不明白程序为何会在pNewInstance->ChangeName();这一句崩溃。当时我也不是很确定,就这样分析:智能指针变量boost::shared_ptr<MyClass>ptrParam作为一个局部变量,当离开其作用域时,估计是执行了MyClass析构函数。
晚上回来查了下资料,比较标准的解释是:智能指针自动地增加和减少它指向对象的引用计数,当对象引用计数减少到0的时候自动摧毁。如果一个函数使用智能指针作为参数,那么不要把一个没有被其他智能指针引用的对象常规指针作为参数传入到函数中。如果这样做,那么这个对象指针将会被摧毁掉。接下来是这个问题详细描述:
1 常规指针pkObject指向一个动态分配的对象,其引用计数为0。
2 传输pkObject到一个智能指针参数,编译器隐式调用智能指针的构造函数将pkObject转换到一个临时的智能指针,并将对象的引用计数增加到1。
3 在函数调用的作用域,这个临时智能指针通过调用智能指针的拷贝构造函数复制到一个局部智能指针中,并将对象的引用计数增加到2。
4 当函数调用返回的时候,局部智能指针被摧毁,并将对象的引用计数减少到1。
5 在调用完成的时候,临时智能指针对象也被摧毁,并将对象的引用计数减少到0,这导致对象被释放掉。
参考文献:
1.智能指针
如果你觉得我的博客对你有帮助,请在下面网址中博客之星评选活动投我一票:
http://vote.blog.csdn.net/item/blogstar/clever101(单击候选人介绍下面的投他一票那个按钮)
参与投票有机会获奖:
最佳贡献奖:通过微博分享活动就有机会获得30元充值卡一张(每周抽选5名)
幸运奖:凡参与投票用户就有机会获得精美小礼品一份。(每周抽选5名)
积极参与奖:所有参与投票并符合条件的用户均可获得20个下载积分。
相关文章推荐
- 智能指针变量做函数参数的一个值得注意的地方
- 用变量a给出下面的定义:一个有10个指针的数组,该指针指向一个函数,该函数有一个整形参数并返回一个整型数
- 关于指针作为函数参数传递的理解,对比普通变量作为函数参数的需注意点,其实就是行参和实参的问题。
- js当一个变量为函数时 应该注意的一点细节小结
- 无法把指针变量本身传递给一个函数
- 无法把指针变量本身传递给一个函数
- 建立一个对象数组,内放5个学生的数据(学号,成绩),用指向对象的指针做函数参数,在max函数中找出5个学生中成绩最高者,并输出其学号。
- [C++] C++中const修饰指针,变量, 函数参数和函数返回值的用法总结
- 一个可以不传参数就可以在函数中改变调用者内部的变量数据的函数
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序
- 3、定义一个结构体变量(包含年月日),计算该日在本年中为第几天?要求写一个days函数。参数是此结构体类型的变量,返回值是整数。
- C#调用参数为函数指针的API函数 - 以SetUnhandledExceptionFilter为例编写一个全局异常处理程序
- C语言-----内存与指针(3) How 4000 do you pass a string to a function如何给一个函数传入字符串作为参数:
- 函数参数用指针或引用传递时发现的一个小问题
- 83 js 如何正确传递DOM元素的指针 选择器内参数为变量 论js函数的简化 seajs用法
- [Boolan] C++第一周(创建一个不带指针成员变量的类)[注意事项]
- C++指针作为函数的参数进行传递时需要注意的一些问题
- 享变量内有一个函数指针,是外部传进来的。 可我一使用这个函数指针,就出错了
- c语言中函数返回局部变量的指针(一些容易犯错的地方)
- 1. 给定两个整形变量的值,将两个值的内容进行交换。 2. 不允许创建临时变量,交换两个数的内容(附加题) 3. 求10 个整数中最大值。 4. 写一个函数返回参数二进制中 1 的个数