C++ 对象在内存中是连续的吗?

标签 c++ c arrays pointers memory

我不太擅长 C++,我目前正在将一些代码移植到 C。它分配了一大堆对象,如下所示:

o_list::Node** nodes = (o_list::Node**)malloc(SIZE*sizeof(o_list::Node*));

然后用以下内容填充每个位置:

for(int u=0;u<SIZE;u++)
   nodes[u] = new o_list::Node();

据我所知,我们对连续内存的唯一保证是指向对象的指针实际上是连续的,即我们可能会:

 _____________________
|x||x||x||x||x||x||x|x| -> contiguous array of pointers;
 |   \ \         
 |    \ \______
 |     \       \
 O      O       O       -> not contiguous positions of objects;

为了纠正这个问题,我尝试 malloc 第一个数组(指针),然后 malloc 一个对象数组,然后将指针分配到正确的位置,如下所示:

o_list::Node** nodes = (o_list::Node**)malloc(SIZE*sizeof(o_list::Node*));

o_list::Node* contObjs = (o_list::Node*)malloc(SIZE*sizeof(o_list::Node));

for(int u=0;u<SIZE;u++){
   contObjs[u] = o_list::Node();
   nodes[u] = &contObjs[u];
}

但这会导致段错误。我想知道我的假设是否正确以及为什么我在第二个选项中出现段错误。

谢谢

最佳答案

您的路线是正确的,尽管完全摆脱第一个数组会更好(如果可以的话)。它可能涉及您程序中其他地方的一些设计更改,所以让我们暂时保留它。

至于你的段错误,我能看到的唯一问题是如果 SIZE 不等于 300000,你就会越界。为什么不在循环中使用 SIZE

关于C++ 对象在内存中是连续的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29098358/

相关文章:

c++ - OpenCV CLion (Cmake) 链接问题 - cmake 报告一个奇怪的错误

c - 使用节点地址的链表大小

c - 将过剩绘制另存为 PNG/BMP/JPG

javascript - 如何基于 JSON 数组绘制多个多边形

javascript - 数组:有条件地映射元素

c++ - C++中的模板调试

c++ - 内联汇编是 ANSI C 标准的一部分吗?

javascript - 使用 .reduce() 对数字进行因式分解

c++ - 指针疯狂,我只是想不通

c - Visual Studio 2017 上忽略了 typedef