求大神看下return后变量不是离开作用域了吗,怎么还有效呢?

mingzhentanwo 2015-10-18 08:02:16
#include <iostream>
#include <vector>
#include <memory>

using namespace std;

shared_ptr<vector<int> > new_vector()
{
return make_shared<vector<int>>();
}

int main()
{
shared_ptr<vector<int>> pv = new_vector(); //这里返回的有效吗?
if (!pv){
cout << "not enough memory " << endl;

}

return 0;
}
...全文
312 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangyunzhao 2015-10-22
  • 打赏
  • 举报
回复
有个函数叫拷贝构造函数,自己写一个,断点跟一次就明白了
baidu_32192431 2015-10-21
  • 打赏
  • 举报
回复
你这是IOS语言??
l4kangaxx 2015-10-21
  • 打赏
  • 举报
回复
当然即使不是share_ptr,你return对象,还是导致一个copy,给你在栈里面弄出一个copy构造过的新对象,你的函数调用已经走到头了,这个新对象才刚刚开始。
l4kangaxx 2015-10-21
  • 打赏
  • 举报
回复
share_ptr,你在return 的时候不是触发一次copy的么,毕竟你又不是return 地址。
赵4老师 2015-10-20
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察! 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
jiht594 2015-10-19
  • 打赏
  • 举报
回复
如果一张纸上系了一根绳子(指针), 你想用的时候拽过来看看, 再把这纸撕掉...这样才是不行的
jiht594 2015-10-19
  • 打赏
  • 举报
回复
返回局部对象的指针或者引用会出问题. 你这个是返回对象, 不是对象的指针或引用. 一张纸, 复印了一份给你, 再把原来的撕掉, 你手里的也还在
橘风之轮 2015-10-19
  • 打赏
  • 举报
回复
return 如果返回的是函数内临时变量的指针就会有很大概率出现问题
fefe82 2015-10-18
  • 打赏
  • 举报
回复
T func(...) { .... return expr; } return 语句的语义是用 epxr 的值初始化一个 T 类型的临时变量 T temp = expr; ,并将 temp 作为返回值。如果 T 是一个类,通常会发生 copy 或者 move 。 你这里虽然 make_shared<vector<int>>(); 的结果在 new_vector 之外无效了,但是返回值是它的一个拷贝,所以没有问题。 (注意,如果返回值是一个引用,这么做就有问题了。) ====================== 6.6.3 The return statement [stmt.return] 2 The expression or braced-init-list of a return statement is called its operand. ...... the return statement initializes the object or reference to be returned by copy initialization (8.5) from the operand.

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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