c++ - 在 C++ 2003 中重新调整本地分配的对象

标签 c++ stack allocation c++03

我对这段代码有种不好的预感

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:返回的行为创建了一个按位复制。

一步一步,代码工作如下:

  1. malloc(sizeof(widget));

    在堆[1] 上分配一 block 内存,从某个地址开始(我们称它为 a),sizeof(widget) 字节长。

  2. widget* theWidget = (widget *) malloc(sizeof(widget));

    在变量theWidget 中存储堆栈[2] 上的地址a。如果 malloc 在地址 0x00001248 分配了一个 block ,那么 theWidget 现在包含值 0x00001248,就好像它是一个整数。

  3. 返回Widget;

    现在返回 a,即值 0x00001248 被写入任何需要返回值的地方。

在任何时候都不会使用 theWidget 的地址。因此,不存在访问指向 theWidget 的悬垂指针的风险。请注意,如果您的代码返回 &theWidget;,就会出现问题。

[1] 否则可能失败,返回NULL

[2] 或者它可能会把它保存在寄存器中

关于c++ - 在 C++ 2003 中重新调整本地分配的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32273896/

相关文章:

c++ - Qt OpenCV - 显示转换帧时的 SIGSEGV

Rust 实现迭代器

Java - 当文件中的数据超出限制时打印消息?

c++ - 构造函数调用了已创建的对象

c++ - 解引用void指针以将值分配给struct

c++ - 使用指针遍历多维数组

c++ - SDL C++ 问题(窗口处于等待状态)

java - 为什么我的二叉搜索树不会显示超过 3 个节点?

c - 为字符指针分配内存

在 C 中选择正确的存储(X、Y、状态)