【发布时间】:2019-12-13 17:39:12
【问题描述】:
我只是想知道以下将在func1 内部创建的指针变量传递给调用者(func2)的方法是否是正确的方法。如果正确,返回func2时会释放内存吗?如果这是一个坏主意,为什么会这样?
int & func1()
{
std::shared_ptr<int> d = std::make_shared<int>(50);
return *d;
}
void func2(){
int & dd = func1();
}
这是一个简化的代码。我假设d 的大小很大(例如图片)。
添加: 我意识到以下也有效。每种方法的优点和缺点是什么?
std::shared_ptr<int> & func1()
{
std::shared_ptr<int> d = std::make_shared<int>(50);
return d;
}
void func2()
{
std::shared_ptr<int> & dd = func1();
}
【问题讨论】:
-
简单地使用共享指针有什么问题?为什么需要参考?返回对在函数内部创建的局部变量的引用是自找麻烦。
-
您可能还想在此处添加 C++ 标签以获得更多关注
-
感谢您的评论! shared_ptr 有一个控制块。我认为仅返回 shared_ptr 将需要额外的成本来复制控制块。简单地返回共享指针好吗?
-
只有一个指向对象的实例,它是在您的 make_shared 调用期间创建的。返回 shared_ptr 的副本不会创建指针指向的对象的另一个实例。
-
在这两种情况下,
func1返回一个悬空引用,指向一个已经被销毁的对象。任何实际使用该引用的尝试都会表现出未定义的行为。不清楚为什么首先需要shared_ptr,但如果你觉得需要,只需按值返回,就像std::make_shared一样。
标签: c++ c++11 pass-by-reference smart-pointers