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

a3m*_*ord 5 c c++ memory arrays pointers

我不太擅长C ++,目前正在将一些代码移植到C中。它分配了很多这样的对象:

o_list::Node** nodes = (o_list::Node**)malloc(SIZE*sizeof(o_list::Node*));
Run Code Online (Sandbox Code Playgroud)

然后在每个职位上填写:

for(int u=0;u<SIZE;u++)
   nodes[u] = new o_list::Node();
Run Code Online (Sandbox Code Playgroud)

据我了解,关于连续内存的唯一保证是指向对象的指针实际上是连续的,也就是说,可能发生以下情况:

 _____________________
|x||x||x||x||x||x||x|x| -> contiguous array of pointers;
 |   \ \         
 |    \ \______
 |     \       \
 O      O       O       -> not contiguous positions of objects;
Run Code Online (Sandbox Code Playgroud)

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

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];
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Lig*_*ica 2

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

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