以下代码将导致内存丢失,因为构造时RA是无效的。我什么时候可以解决这个问题?
使用shared_ptr或希望将来的编译器版本捕获此不良代码?
#include <memory>
using namespace std;
struct A {};
void use(const A& a) {};
unique_ptr<A> foo()
{
unique_ptr<A> pa(new A());
return pa;
}
int main()
{
const A& rA = *foo(); // rA is unusable, initialized with invalid reference (invalidated by destruction of temporary unique_ptr returned from foo)
use(rA);
}
将您的 main
重写为:
int main()
{
auto a = foo();
use(*a);
}
顺便说一句,我将重写foo
为:
std::unique_ptr<A> foo()
{
return std::make_unique<A>();
}
当您返回对象通过Value 返回临时,除非是从呼叫者的侧面复制或绑定到变量。
您做错了什么是绑定返回的临时对象包含而不是返回的对象本身的引用。当您访问事物时,您已经绑定了对其的引用时已被临时对象的破坏器删除时已删除。
为了说明您做错了什么,我使用 std::vector
编写了一个同等的示例,并将引用绑定到其元素之一:
void use(const int& a) {}
std::vector<int> foo()
{
return {1, 2, 3};
}
int main()
{
const int& rA = foo()[0]; // bind to an element
// the vector itself is destroyed by the time we get here
use(rA); // whoops using a reference to an element from a destroyed vector
}