我对这段代码有种不好的预感
widget* GetNewWidget()
{
widget* theWidget = (widget *) malloc(sizeof(widget));
return theWidget;
}
首先,永远不要转换 malloc() 的结果(我怀疑也不应该在 C++ 中使用它(?))。
其次,theWidget
不会分配到栈上吗?
如果是这样,调用者在这个函数返回后尝试访问会不会是未定义的行为?
谁能指出一个权威的 URL 来解释这个?
[更新]我在想这个问题Can a local variable's memory be accessed outside its scope?
最佳答案
总结:这段代码非常好
返回一个指针就像返回一个int
:返回的行为创建了一个按位复制。
一步一步,代码工作如下:
malloc(sizeof(widget));
在堆[1] 上分配一 block 内存,从某个地址开始(我们称它为 a),
sizeof(widget)
字节长。widget* theWidget = (widget *) malloc(sizeof(widget));
在变量
theWidget
中存储堆栈[2] 上的地址a。如果malloc
在地址0x00001248
分配了一个 block ,那么theWidget
现在包含值0x00001248
,就好像它是一个整数。返回Widget;
现在返回 a 的值,即值
0x00001248
被写入任何需要返回值的地方。
在任何时候都不会使用 theWidget
的地址。因此,不存在访问指向 theWidget
的悬垂指针的风险。请注意,如果您的代码返回 &theWidget;
,就会出现问题。
[1] 否则可能失败,返回NULL
[2] 或者它可能会把它保存在寄存器中
关于c++ - 在 C++ 2003 中重新调整本地分配的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32273896/