C++11智能指针之shared_ptr的使用(1)

先来看一段简单的代码:

#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++的网站上也提供了更多在线编译器



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值