几个同事和我正在讨论当从C++方法返回局部变量(在堆栈上分配)时会发生什么.
以下代码适用于单元测试,但我认为这只是因为单元测试很幸运,并且不会尝试重用obj使用的堆栈上的内存.
这有用吗?
static MyObject createMyObject() {
MyObject obj;
return obj;
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*som 24
发生的是复制构造函数被调用以制作本地对象的副本,这就是调用者接收的内容.
编译器可能会在名为copy elision的过程中删除副本,但这完全由编译器决定 - 您无法对其进行太多控制.
此模式能够产生您害怕的问题,但前提是您返回指向本地对象的指针或引用.
obj 创建,然后使用对象的复制构造函数将其从方法/函数中复制出来。
您也可以obj通过声明它使其不在堆栈中static。返回对象也会返回一个副本,但不会在每次调用函数时创建对象。然后,您可以将对象作为引用返回:
static MyObject & createMyObject() {
static MyObject obj;
return obj;
}
Run Code Online (Sandbox Code Playgroud)
(这里没有副本,也obj只创建一次,它的地址在运行时保持不变)。