将 free 与指向结构的双指针一起使用
Using free with double pointer to a struct
我正在尝试了解如何使用 free
功能。在以下代码片段中,我使用 malloc
.
创建了 ctx
void serve(ctx **some_struct_type) {
// .. some operation
}
int main() {
context_t* ctx = malloc(sizeof(struct context_t));
serve(&ctx);
}
由于每次malloc调用都要有对应的free
调用,而我想在serve
里面调用free,应该是free((**ctx))
还是free((*ctx))
?
我对必须调用 free 的方式有点困惑。
在main
中,ctx
的值是分配内存块的地址。正是这个值被传递给 free
.
如果将 ctx
的地址传递给函数,则需要取消引用该指针以获取从 malloc
获得的指针值。
所以假设函数声明为:
void serve(struct context_t **ctx) {
你想要free(*ctx)
在这个函数中。
您在 main
中声明了一个指针
context_t* ctx = malloc(sizeof(struct context_t));
要释放在 main 中分配的内存,您可以这样写
free( ctx );
但是你通过引用函数传递了指针serve
serve(&ctx);
因此,要在函数中获取引用对象(指针),您必须取消引用声明为函数参数的指针(我将更改函数参数以使其对函数有意义)
oid serve( context_t **p ) {
那就是你需要写
free( *p );
其中 *p
是原始对象 ctx
的 lvalue
。
malloc函数用于在程序执行期间分配一定数量的内存。它向 OS 发送请求,如果可能,OS 将从堆中保留请求的内存量。 (分配space的函数returns地址)
+-------+------------------+------+----------------------+
| stack | -> free space <- | heap | data & code segments |
+-------+------------------+------+----------------------+
free 以另一种方式工作,它获取指向某个内存块的地址 (引用) 并释放它。
如果你想在 main 中释放它,你可以这样做:
int main() {
context_t* ctx = malloc(sizeof(struct context_t));
free(ctx);
}
但是由于您要将其转换为双指针(指向指针的指针),因此您需要将其取消引用回到您分配的地址:
int main() {
context_t* ctx = malloc(sizeof(struct context_t));
ctx **some_struct_type = &ctx;
free(*some_struct_type);
}
我正在尝试了解如何使用 free
功能。在以下代码片段中,我使用 malloc
.
ctx
void serve(ctx **some_struct_type) {
// .. some operation
}
int main() {
context_t* ctx = malloc(sizeof(struct context_t));
serve(&ctx);
}
由于每次malloc调用都要有对应的free
调用,而我想在serve
里面调用free,应该是free((**ctx))
还是free((*ctx))
?
我对必须调用 free 的方式有点困惑。
在main
中,ctx
的值是分配内存块的地址。正是这个值被传递给 free
.
如果将 ctx
的地址传递给函数,则需要取消引用该指针以获取从 malloc
获得的指针值。
所以假设函数声明为:
void serve(struct context_t **ctx) {
你想要free(*ctx)
在这个函数中。
您在 main
中声明了一个指针context_t* ctx = malloc(sizeof(struct context_t));
要释放在 main 中分配的内存,您可以这样写
free( ctx );
但是你通过引用函数传递了指针serve
serve(&ctx);
因此,要在函数中获取引用对象(指针),您必须取消引用声明为函数参数的指针(我将更改函数参数以使其对函数有意义)
oid serve( context_t **p ) {
那就是你需要写
free( *p );
其中 *p
是原始对象 ctx
的 lvalue
。
malloc函数用于在程序执行期间分配一定数量的内存。它向 OS 发送请求,如果可能,OS 将从堆中保留请求的内存量。 (分配space的函数returns地址)
+-------+------------------+------+----------------------+
| stack | -> free space <- | heap | data & code segments |
+-------+------------------+------+----------------------+
free 以另一种方式工作,它获取指向某个内存块的地址 (引用) 并释放它。
如果你想在 main 中释放它,你可以这样做:
int main() {
context_t* ctx = malloc(sizeof(struct context_t));
free(ctx);
}
但是由于您要将其转换为双指针(指向指针的指针),因此您需要将其取消引用回到您分配的地址:
int main() {
context_t* ctx = malloc(sizeof(struct context_t));
ctx **some_struct_type = &ctx;
free(*some_struct_type);
}