记录智能指针和string使用中发现的问题

记录智能指针和string使用中发现的问题

1 智能指针指向指针或数组

在c++11中,想要智能指针指向数组,需要这样写

auto sp = make_shared<int> (new int[100]);
auto up = make_unique<int[]> (new int[100]);

注意两个shared_ptr和unique_ptr的模板参数不同。但是只有这样写在c++11中才能编译通过。
但是在c++11 中, shared_ptr这种写法是有问题的。但是unique_ptr这种做法是正确的。
因为shared_ptr的默认删除器是delete,指向数组时模板参数依然是单个元素类型,所以析构会调用delete 而不是delete[], 造成内存或资源泄露
解决办法:
1:升级到c++17
2:使用unique_ptr或原始指针
3:自定义删除器
参考:https://stackoverflow.com/questions/13061979/shared-ptr-to-an-array-should-it-be-used

2 string做右值

string f() {
	string str;
	reutrn str;
}

f() = "test";

这段代码是可以编译通过运行的,但是和常识有点不符合,感觉上f()的返回值是个右值,但是为什么还能赋值呢。没有错,是右值,但是就是可以赋值,因为string 重载了operator = , 这里是因为这个重载才能编译运行的。如果换成int这样的基础类型是会报错的。
参考:https://stackoverflow.com/questions/35648731/why-can-i-assign-something-to-rvalue-string

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值