我不太擅长 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/