C++11智能指针之shared_ptr的使用(1)
2016-03-27 01:30
351 查看
先来看一段简单的代码:
输出结果为:n1 = 6 n2 = 6
智能指针的使用稍显麻烦,出于我们之前使用指针的习惯,文中的shared_ptr<int> sp(new int(n1))可否换成shared_ptr<int> sp(&n1)呢?
如此一来不就省去了后面的n1=*sp吗?
答案是不能。因为shared_ptr对自己管理的内存会自动释放,而在本段代码中,n1是栈上的对象,会自动被清理。那么问题来了,n1可能会被清理两次。
我在使用gcc4.6.3发现此问题后,又分别使用VS和mingw做了验证。
奇怪的是在vs2013社区版中不会报错,mingw也没报错。
后面我又找了一些对C++11/14完全支持的在线编译器,结果在直接传入栈上对象的地址后果然报错了。
所以在使用微软的编译器或mingw的时候需谨慎。遇到有疑惑的代码及时使用gcc/clang,或者在线编译器验证。
除了上面我用的那个之外,iso C++的网站上也提供了更多在线编译器。
#include <iostream> #include <memory> using namespace std; void test_smartpointer(shared_ptr<int> sp) { (*sp)++; } void test_pointer(int *p) { (*p)++; } int main() { int n1 = 5, n2 = 5; shared_ptr<int> sp (new int(n1)) test_smartpointer(sp); n1=*sp; test_pointer(&n2); cout << "n1 = " << n1 << " n2 = " << n2 << endl; return 0; }
输出结果为:n1 = 6 n2 = 6
智能指针的使用稍显麻烦,出于我们之前使用指针的习惯,文中的shared_ptr<int> sp(new int(n1))可否换成shared_ptr<int> sp(&n1)呢?
如此一来不就省去了后面的n1=*sp吗?
答案是不能。因为shared_ptr对自己管理的内存会自动释放,而在本段代码中,n1是栈上的对象,会自动被清理。那么问题来了,n1可能会被清理两次。
我在使用gcc4.6.3发现此问题后,又分别使用VS和mingw做了验证。
奇怪的是在vs2013社区版中不会报错,mingw也没报错。
后面我又找了一些对C++11/14完全支持的在线编译器,结果在直接传入栈上对象的地址后果然报错了。
所以在使用微软的编译器或mingw的时候需谨慎。遇到有疑惑的代码及时使用gcc/clang,或者在线编译器验证。
除了上面我用的那个之外,iso C++的网站上也提供了更多在线编译器。
相关文章推荐
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 在 Qt4 中使用 C++11
- c++11新特性--decltype auto
- centos安装devtoolset-3支持gcc 4.9.2
- 使用eclipse编译含有C++11特性的代码
- 怎样在Linux环境编译支持C11
- eclipse支持c++11
- C++11可变参数函数与for循环
- vs2013 编译c++是发现惊天bug
- 简单性能测试函数模板
- 关于C++现状的一些思考
- 用C++11优化矩阵运算的空间和时间效率
- 浅析构造函数之默认构造函数
- c++中返回数组的函数
- C++函数重载的几个问题
- C++11 note-2 字符串 容器 迭代器
- C++11 现代C++风格的新元素
- c++11 lambda表达式浅谈
- C++11之“move”语意
- C++11之Lambda表达式