多个指向C中重新分配的内存块的指针

时间:2017-10-08 03:33:29

标签: c pointers memory-management

假设我有多个指向堆内存块的指针。我们假设第一个指针是内存的 所有者 ,还有一些其他指针充当 句柄 < / strong>在我的申请中。只要拥有者是free唯一的所有者,我们就不会有内存泄漏,也不会释放一块内存。

/* Here is the owner */
size_t block_size = SOME_BLOCK_SIZE;
char *owner = malloc(block_size);

/* And a few handles that access the block in different places */
char *handle_1 = owner[10];
char *handle_2 = owner[359];
char *handle_3 = owner[172];

到目前为止一切顺利。稍后我们realloc所有者增加容量

char *tmp = realloc(owner, 2 * SOME_BLOCK_SIZE);
if (!tmp) {
    fprintf(stderr, "Error: could not reallocate array\n");
    exit(-1);
}

if (tmp == owner) {
    printf("We all know what happens here...\n");
    printf("the owner array just increased size\n");
}
else {
    printf("We had to move the owner array to a new memory address\n");
    printf("What happens to the handles?\n");
}

有三种可能的结果:

  1. realloc失败,因为没有更多内存。
  2. realloc成功扩展了数组而无需移动它。
  3. realloc成功扩展了数组,但它已移至新的内存区域。
  4. 我的问题是,在案例3中我们之前定义的句柄会发生什么?我希望因为它们只是指针变量,并且因为realloc函数不知道它们的存在,所以句柄仍然指向旧的内存地址。事情变得很糟糕很容易。

    我的直觉是否正确?如果是这样,那么最好的方法是什么(除了从不调整大小)?我担心我只需要保留一个活动句柄列表,并在检测到owner被移动时更新它们。我对如何实现这一点有了一个想法,但我宁愿使用别人的聪明解决方案而不是重新发明轮子。

1 个答案:

答案 0 :(得分:0)

是的,就像ryan和true推荐的那样,你应该使用一个基指针(所有者)。在realloc的情况下,可以更新该基指针。您的句柄应作为此基指针的偏移量进行管理。

int handle1_off = 10;
int handle2_off = 359;
...

如果要访问句柄,则必须计算实际指针。

memcpy(owner + handle1_off, some_other_pointer, some_size);