4 c c++ stack allocation release
我正在审查一个朋友的代码,并就C/C++如何在堆栈上分配内存并管理其发布进行了一场有趣的辩论.如果我要在一个函数中创建一个包含10个对象的数组,但是返回所述数组,它会在函数弹出时释放(从而使给定的数据无效),还是放入堆中(这引发了我们如何解决的问题)释放它?).
示例代码如下:
Gene* GetTopTen()
{
// Create 10 genes (or 10 objects, doesn't matter)
Gene Ten[10];
// Sort out external pool data
Sort();
// Copy over data to the array of 10 objects
for(int i = 0; i < 10; Ten[i++] = pool[i]);
// Here is the core of my question:
return Ten;
}
Run Code Online (Sandbox Code Playgroud)
非常感谢任何帮助,这变成了一个非常有趣的问题,我的朋友和我无法回答.
函数返回后,数据不会被破坏,但可能会被下一个函数调用覆盖.你可能会很幸运,它可能仍然存在,但它是未定义的行为.你不应该依赖它.
以下是可能发生的情况:在函数期间,堆栈如下所示:
"---------------------------
| caller function's data |
----------------------------
| Ten[9] |
| Ten[8] |
| ... |
| Ten[0] |
---------------------------"
Run Code Online (Sandbox Code Playgroud)
函数退出后,它可能会立即显示相同的内容.但是如果调用者调用这样的另一个函数,
void some_func() {
Gene g;
...
}
Run Code Online (Sandbox Code Playgroud)
堆栈现在看起来像这样:
"---------------------------
| caller function's data |
----------------------------
| g |
----------------------------
| Ten[8] |
| ... |
| Ten[0] |
---------------------------"
Run Code Online (Sandbox Code Playgroud)
某些数据可能会被静默覆盖(在这种情况下是这样Ten[9]),并且您的代码不会知道它.您应该在堆上分配数据malloc()并显式释放它free().
| 归档时间: |
|
| 查看次数: |
418 次 |
| 最近记录: |