我正在阅读 C 中的内存所有权模型,并遇到以下示例来解释 C 中的内存所有权模型。
void Z(void) {
void *buffer;
while (!is_queue_empty(&queue)) {
buffer = queue_pop(&queue);
// do something useful
free(buffer);
}
}
void Y(void **buffer_p, int function) {
switch (function) {
// lots of cases
default:
enqueue(&queue, *buffer_p);
*buffer_p = NULL; // "claim ownership"
break;
}
}
void X(void) {
void *buffer = malloc(1024 * 1024);
Y(&buffer, 3);
}
有人可以解释一下,当函数
Y
时是什么意思吗?如上所示“声明所有权”?它如何声明所有权?还有设置*buffer_p = NULL
是什么意思内Y
然后再次调用 free
内Z
?
最佳答案
在这个例子中,“所有权”意味着谁负责释放分配的内存。使用 malloc
动态分配内存时,该内存的地址应该传递给 free
正好一次。
请注意 X
传入buffer
的地址至 Y
允许 Y
改变这个变量的值。内部Y
,它将分配的指针复制到队列内存结构中。此时这个结构和buffer
X
中的变量包含指向该内存的指针。
如果这就是 Y
中发生的所有事情,那么就会出现这个内存应该释放到哪里的问题。下一行通过分配 NULL
来处理这个问题。到解除引用的参数。本套buffer
在 X
至 NULL
,所以现在 X
不用担心这个内存。换句话说,该内存的所有权是从 X
传递过来的。到队列数据结构。
如果你再看 Z
,你可以看到它从队列中拉出一个对象并调用 free
在那段内存中。
关于c - 了解 C 中的内存所有权模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60046802/