关于智能指针

szn_409 2016-02-17 08:54:18
第一个问题
while(1)
{
shared_ptr<int> p(new int[10], [](int* x){delete[] x;});
shared_ptr<int> p1(new int[1000]);
}
如上,为什么此段代码不会涨内存?

第二个问题
shared_ptr<int> pValue3(new int(40));
shared_ptr<int> pValue5(new int[40], [](int* x){delete[] x;});
shared_ptr<int> pValue6(pValue3, [](int* x){delete x;});
如上,为什么显示第三句代码是错的,而第二句代码是对的?

第三个问题
unique_ptr<int> pUinque(new int(30));
shared_ptr<int> pValue6(pUinque);
如上,为什么第二句代码是错的?

第四个问题
shared_ptr<int> pValue = make_shared<int>(20); //make_shared是安全的分配和使用动态内存的方法,推荐使用这种方法
shared_ptr<int> pValue2 = make_shared<int>(30);
pValue.reset(pValue2);
pValue.reset(pValue2, [](int* x){delete x;});
如上,第三句代码和第四句代码是错的?
...全文
377 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
stephen_csdn 2016-03-04
  • 打赏
  • 举报
回复
引用 10 楼 szn_409 的回复:
[quote=引用 9 楼 butters10 的回复:] shared_ptr<int> p1(new int[1000]); 这个肯定申请到了内存空间的,不涨内存是不是指不会溢出,因为可以不指定删除器的,智能指针可以~的时候释放
看下这段代码: while(1) { const int Length = 1024 * 1024 * 10; char* Str = new char[Length]; memset(Str, 0, Length); delete Str; } 明明使用 new[] 释放使用delete,为什么不涨内存?[/quote] 你释放之前当然有涨内存。。。
szn_409 2016-03-02
  • 打赏
  • 举报
回复
引用 9 楼 butters10 的回复:
shared_ptr<int> p1(new int[1000]); 这个肯定申请到了内存空间的,不涨内存是不是指不会溢出,因为可以不指定删除器的,智能指针可以~的时候释放
看下这段代码: while(1) { const int Length = 1024 * 1024 * 10; char* Str = new char[Length]; memset(Str, 0, Length); delete Str; } 明明使用 new[] 释放使用delete,为什么不涨内存?
stephen_csdn 2016-02-28
  • 打赏
  • 举报
回复
shared_ptr<int> p1(new int[1000]); 这个肯定申请到了内存空间的,不涨内存是不是指不会溢出,因为可以不指定删除器的,智能指针可以~的时候释放
szn_409 2016-02-28
  • 打赏
  • 举报
回复
引用 1 楼 begodliker 的回复:
第一个问题: p和p1超出了作用域,内存自动释放了 后面三个问题,函数的参数类型传的不对
p1的释放方式不是有问题么,shared_ptr对于动态数组要自己传递删除器的,既然不能正确释放,为什么不涨内存
iyomumx 2016-02-18
  • 打赏
  • 举报
回复
1.很多STL的实现中new和new[]都使用malloc来实现,delete和delete[]对应都使用free来实现,所以new[]分配delete可能不会出错,但不代表这样使用是错误的。 2.智能指针不能隐式转换为裸指针。 3.pUinque不是右值。 4.同2
szn_409 2016-02-18
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
[quote=引用 4 楼 szn_409 的回复:] [quote=引用 1 楼 begodliker 的回复:] 第一个问题: p和p1超出了作用域,内存自动释放了 后面三个问题,函数的参数类型传的不对
关于第一个问题,shared_ptr<int> p1(new int[1000]); 此句代码并没有传入删除器,为什么内存不涨?[/quote] 搜“内存延迟分配”[/quote] 能具体解释下吗
赵4老师 2016-02-18
  • 打赏
  • 举报
回复
引用 4 楼 szn_409 的回复:
[quote=引用 1 楼 begodliker 的回复:] 第一个问题: p和p1超出了作用域,内存自动释放了 后面三个问题,函数的参数类型传的不对
关于第一个问题,shared_ptr<int> p1(new int[1000]); 此句代码并没有传入删除器,为什么内存不涨?[/quote] 搜“内存延迟分配”
szn_409 2016-02-17
  • 打赏
  • 举报
回复
引用 1 楼 begodliker 的回复:
第一个问题: p和p1超出了作用域,内存自动释放了 后面三个问题,函数的参数类型传的不对
关于第一个问题,shared_ptr<int> p1(new int[1000]); 此句代码并没有传入删除器,为什么内存不涨?
yshuise 2016-02-17
  • 打赏
  • 举报
回复
第二个问题 shared_ptr<int> pValue3(new int(40)); shared_ptr<int> pValue5(new int[40], [](int* x){delete[] x;}); shared_ptr<int> pValue6(pValue3, [](int* x){delete x;}); 如上,为什么显示第三句代码是错的,而第二句代码是对的? ============================================================= shared_ptr一般不用于数组,用得写好释放方式。因此,第二句对,第三句错。
yshuise 2016-02-17
  • 打赏
  • 举报
回复
shared_ptr<int> p1(new int[1000]); ===================================== 这个不能用于数组,因而是错误的。第一个是因为你写了释放内存的方式,所以正确。
begodliker 2016-02-17
  • 打赏
  • 举报
回复
第一个问题: p和p1超出了作用域,内存自动释放了 后面三个问题,函数的参数类型传的不对

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧