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

时间:2015-03-17 11:51:16

标签: 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一个对象数组,然后将指针指向正确的位置,如下所示:

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];
}

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

由于

3 个答案:

答案 0 :(得分:1)

你在正确的路线上,虽然完全摆脱第一个阵列会更好(如果可以的话)。它可能涉及程序中其他地方的一些设计更改,所以暂时离开。

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

答案 1 :(得分:1)

目前尚不清楚为什么需要一个指针数组开始。

尽管如此,有几种方法可以实现您的要求:


o_list::Node  objArray[SIZE];
o_list::Node* ptrArray[SIZE];

for (int i=0; i<SIZE; i++)
    ptrArray[i] = objArray+i;

o_list::Node* objArray = malloc(SIZE*sizeof(o_list::Node));
o_list::Node* ptrArray[SIZE];

for (int i=0; i<SIZE; i++)
    ptrArray[i] = objArray+i;

o_list::Node   objArray[SIZE];
o_list::Node** ptrArray = malloc(SIZE*sizeof(o_list::Node*));

for (int i=0; i<SIZE; i++)
    ptrArray[i] = objArray+i;

o_list::Node*  objArray = malloc(SIZE*sizeof(o_list::Node));
o_list::Node** ptrArray = malloc(SIZE*sizeof(o_list::Node*));

for (int i=0; i<SIZE; i++)
    ptrArray[i] = objArray+i;

答案 2 :(得分:0)

我不是C ++方面的专家,但是不是new的数组形式会分配一个连续的对象数组吗?像这样的东西?

MyClass * arrayOfMyClass = new MyClass[5];

现在你可以说&#34;但是我将它转换为C,而且C没有新的&#34;。这是事实,但C也没有类和运算符重载和复制构造函数。如果要使用malloc,则需要掌握nettle并将Node类转换为C结构。原因是malloc()不是等同于new的C.

new已分配内存构造对象。 malloc仅分配内存。你甚至不能保证它给你的内存是零填充。在C中,您需要提供初始化函数来执行构造函数的操作。您的代码的C等价物将类似于:

void Node_init(struct Node* aNode)
{
    // Any initialisation you need to do of its members
}

...

struct Node* contObjs = malloc(SIZE * sizeof *contObjs); // or use calloc to get zero filled memory

for(int u=0;u<SIZE;u++) {
   Node_init(&contObjs[u]); // Pass the address of the u'th element
}
相关问题