c - 了解 C 中的内存所有权模型

标签 c pointers memory

我正在阅读 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然后再次调用 freeZ ?

最佳答案

在这个例子中,“所有权”意味着谁负责释放分配的内存。使用 malloc 动态分配内存时,该内存的地址应该传递给 free正好一次。

请注意 X传入buffer的地址至 Y允许 Y改变这个变量的值。内部Y ,它将分配的指针复制到队列内存结构中。此时这个结构和buffer X 中的变量包含指向该内存的指针。

如果这就是 Y 中发生的所有事情,那么就会出现这个内存应该释放到哪里的问题。下一行通过分配 NULL 来处理这个问题。到解除引用的参数。本套bufferXNULL ,所以现在 X不用担心这个内存。换句话说,该内存的所有权是从 X 传递过来的。到队列数据结构。

如果你再看 Z ,你可以看到它从队列中拉出一个对象并调用 free在那段内存中。

关于c - 了解 C 中的内存所有权模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60046802/

相关文章:

c - 写入关闭前不可见的文件; fflush(stdout) 无效

c - C语言中使用位域反转位?

arrays - **在C语言中是做什么的?

c++ - 如何从 const float* 中获取 C++ vector

java - 为什么当使用 Powershell 指定 -Xms 和 -Xmx 时它们不执行任何操作,但通过 Netbeans IDE 可以正常工作?

c - 在 Assembly x86 中获取三个数字的最大值时出现段错误

c++ - 在 Visual Studio 2012 中从一个项目引用另一个项目中的 DLL

从概念上讲,为什么数组地址不可修改?

.net - 当我从 .NET 生成一个新线程时到底发生了什么?

Windows 中分配的内存内容