Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 堆内存上的结构_C++_C_Memory Management - Fatal编程技术网

C++ 堆内存上的结构

C++ 堆内存上的结构,c++,c,memory-management,C++,C,Memory Management,这个问题最近在一次采访中被问到,我对此感到困惑 “如何初始化堆内存中的结构?” 谁能告诉我这个问题的正确答案吗 顺便问一下:堆栈内存和堆内存的区别到底有多大? 关于上面的问题,有些人可能还会问我关于如何初始化堆栈内存上的结构? 这可能是一个基本问题,也可能是一个错误的问题,但我只是好奇地想知道 有人能帮忙吗?堆栈用于分配局部变量,堆用于动态分配内存,如malloc()。在这两种情况下,您都需要确保您已经初始化了您的结构。您可以使用类似calloc()的方法从堆中分配内存,从而自动将其归零(mal

这个问题最近在一次采访中被问到,我对此感到困惑

“如何初始化堆内存中的结构?”
谁能告诉我这个问题的正确答案吗

顺便问一下:堆栈内存和堆内存的区别到底有多大? 关于上面的问题,有些人可能还会问我关于
如何初始化堆栈内存上的结构?

这可能是一个基本问题,也可能是一个错误的问题,但我只是好奇地想知道


有人能帮忙吗?

堆栈用于分配局部变量,堆用于动态分配内存,如malloc()。在这两种情况下,您都需要确保您已经初始化了您的结构。您可以使用类似calloc()的方法从堆中分配内存,从而自动将其归零(malloc不会)。堆栈上的变量也没有初始化(如果内存服务)。

堆栈的生命周期与函数实例定义的长度一样长——当函数返回时,内存可以自由回收(如果它保存了一个适当的C++对象W/Beavror和所有的DDOR都将被调用)。堆在显式释放之前一直有效

“如何初始化一个结构”(无论在哪种内存上)——都是一个特殊的问题——显然是通过它在C++中自动调用的cTor(如果有的话),其他代码有一个<代码> MeMCPY < /C> >——在堆栈或堆中,这里没有区别。

struct MyStruct
{
   int foo;
   int bar;
};

...

struct MyStruct* baz = malloc(sizeof(MyStruct));

您现在可以使用
baz
,但其成员foo和bar的值尚未定义。

以下是我对采访问题的回答:

如何初始化堆内存中的结构?

C++语言不需要 堆
  • 在格式良好的代码中,结构应该初始化 在构造函数中,首选在初始化列表中初始化
  • 初始化每个字段 单独使用指向结构的指针。这个问题可以理解为假设结构已经分配
  • 在C语言中,可以使用
    calloc
    , 虽然这会为每个指定零 字节,对于某些对象,这可能不是 说对了
  • 就堆和堆栈之间的区别而言,堆栈是先进先出的数据结构。对象被推到堆栈上,然后弹出。堆是一块内存,其中的项几乎是随机分配的


    在web上搜索内存分配和内存池。许多实现将内存区域实现为朝堆方向增长的堆栈。从堆中分配的空间越多,堆栈的空间就越小,反之亦然。

    重复,例如@gf它不是重复的,因为它不包含向我提出的问题!!它归结为几乎相同的问题,我相信你会找到更好的匹配,如果你愿意搜索一点。我做了搜索,但可以找到我的问题的确切答案,这使我问这个问题。暧昧:C和C++有不同的答案。CalLoor()初始化内存到所有位0。它不会初始化结构。特别是空指针不一定是所有的位0,我有一个旧的DOS编译器,其中NULL是所有的位。是的,当然,你是正确的,我假设初始化= =设置为零。在C++中,你也可以使用<代码>新< /Cord>运算符来执行对象构造函数。构造函数是初始化对象的地方。它为结构分配内存,但不初始化字段。问题是关于结构是否已经堆上的问题。我认为更好的答案是在函数(C++)或构造函数(C++)中单独地初始化每个字段。但是,在c中使用多个赋值还是memcpy/memset/&c并不取决于堆与堆栈的区别(在堆栈上,您可以在变量定义中进行
    ={…}
    初始化,在堆上,您不能:可能是它们的意思)。