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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多个指向C中重新分配的内存块的指针相关的知识,希望对你有一定的参考价值。

假设我有多个指向堆内存块的指针。假设第一个指针是内存的所有者,并且有几个额外的指针在我的应用程序中充当句柄。只要拥有者是唯一一个free'd,我们没有内存泄漏,我们也不会释放一块内存。

/* 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成功扩展了数组,但它已移至新的内存区域。

我的问题是,在案例3中,我们之前定义的句柄会发生什么?我希望因为它们只是指针变量而且因为realloc函数不知道它们的存在,所以句柄仍然指向旧的内存地址。很容易想象事情变得糟糕。

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

答案

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

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

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

memcpy(owner + handle1_off, some_other_pointer, some_size);

以上是关于多个指向C中重新分配的内存块的指针的主要内容,如果未能解决你的问题,请参考以下文章

带指针的内存管理

在 C 中声明指向结构的指针数组,但在需要之前不为结构分配内存

C++ - 从客户端代码中隐藏模板参数

C 语言二级指针案例 ( 字符串切割 | 返回 自定义二级指针 作为结果 | 每个 一级指针 指向不同大小内存 | 精准分配每个 一级指针 指向的内存大小 )

c ++动态指针数组[重复]

为啥在 C 中为数组声明和指向数组声明的指针动态分配的内存不同? [复制]