求大神看下return后变量不是离开作用域了吗,如何还有效呢
求大神看下return后变量不是离开作用域了吗,怎么还有效呢?
#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;
}
------解决思路----------------------
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.
------解决思路----------------------
return 如果返回的是函数内临时变量的指针就会有很大概率出现问题
------解决思路----------------------
返回局部对象的指针或者引用会出问题.
你这个是返回对象, 不是对象的指针或引用.
一张纸, 复印了一份给你, 再把原来的撕掉, 你手里的也还在
------解决思路----------------------
有个函数叫拷贝构造函数,自己写一个,断点跟一次就明白了
#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;
}
------解决思路----------------------
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.
------解决思路----------------------
return 如果返回的是函数内临时变量的指针就会有很大概率出现问题
------解决思路----------------------
返回局部对象的指针或者引用会出问题.
你这个是返回对象, 不是对象的指针或引用.
一张纸, 复印了一份给你, 再把原来的撕掉, 你手里的也还在
------解决思路----------------------
有个函数叫拷贝构造函数,自己写一个,断点跟一次就明白了