c++仅分配函数调用返回的结构的一部分

标签 c++ struct heap-memory assign stack-memory

我有以下结构:

struct foo{
    int a[4];
    int b[4];
}

我有以下功能:

foo get_foo()
{
    foo ret_val;
    <..some assignments here..>
    return ret_val;
}

现在,我的主要代码:

void* process_a()
{
    int* pa = get_foo().a;
    <..do smth with "pa"..>
     return pa;
 }

看起来代码运行良好,但完全不知道完整结构会发生什么,因为我只能访问它的一部分。 还有,问题:

  • 仅将在堆栈上创建的结构的一部分分配给指针可以吗?
  • foo 结构在哪里?在堆栈上?还是堆?
  • 编译器是否足够聪明,可以只分配 int[4](这不太可能),还是会分配完整的 foo
  • 我的爸爸的生活时间是什么时候?我可以在 process_a() 函数之外可靠地使用该指针吗?

谢谢! 伊戈尔。

最佳答案

  • 是的,但它仅在结构的生命周期内有效。
  • 从函数返回的结构是一个临时对象,它会立即被销毁。
    将有一些空间,可能是“在堆栈上”,供函数将其结果返回到其中。
    一旦右侧的赋值执行完毕,该结构就不会存储在任何地方,因为它不存在。
  • 它几乎肯定会为整个结构分配空间。
  • pa 的生命周期是process_a 的主体,但是*pa 的生命周期已经过期,如上所述。
    因此,您不能将 pa 的值用于任何事情(复制它除外),即使是 inside process_a

您的代码似乎运行良好,因为“似乎运行良好”是未定义行为的有效形式,就像其他任何事情一样。

关于c++仅分配函数调用返回的结构的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30529888/

相关文章:

go - 如何初始化特定的结构格式

Android list VM 最小堆大小

C++ Void函数混淆

c++ - 如何防止警告 C4355 : 'this' : used in base member initializer list

c - Strcpy 改变 struct int 数组

c - 返回指向结构数组的指针

swift - 如何在注销时返回iPhone App的第一屏?

javascript - fatal error : CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory

c++ - 将转换后的 .obj 文件更改为 OpenGL 图元

c++ - 为什么在给定 T&& 和 const T& 重载的情况下,const 左值与 const 右值的绑定(bind)不同?