[英]how to free allocated memory inside a function by passing correct pointer to free()
在函數“ create_memory_pool”中,我可以分配內存池,但是我不確定如何從主程序中釋放它。
我想我想念如何將正確的指針從函數傳遞到釋放,從而可以釋放以前分配的內存。
注意我不能更改傳遞給函數創建內存池的參數(不允許)。 但可以更改函數內的內容。
#include <stdio.h>
#include <stdlib.h>
typedef enum {
false,
true
} boolean;
boolean create_memory_pool(char *name, int size)
{
name = malloc(size);
if (name != NULL)
{
printf("malloc successful\n");
return true;
}
else
{
printf("malloc failed\n");
return false;
}
}
int main()
{
boolean rc;
char *name;
// case 2
rc = create_memory_pool(name, 1024);
free(name);
return 0;
}
您的函數create_memory_pool
不公開任何指針。
您必須從以下位置進行更改:
boolean create_memory_pool(char *name, int size)
{
name = malloc(size);
if (name != NULL)
{
printf("malloc successful\n");
return true;
}
else
{
printf("malloc failed\n");
return false;
}
}
至
boolean create_memory_pool(char **name, int size)
{
*name = malloc(size);
if (*name != NULL)
{
printf("malloc successful\n");
return true;
}
else
{
printf("malloc failed\n");
return false;
}
}
在您的main
,將案例2的呼叫更改為:
rc = create_memory_pool(&name, 1024);
您的整個案例1毫無意義。
您應該查看指針的工作方式。
指針不像您想的那樣工作。 您傳遞給create_memory_pool
的名稱是沒有用的。 如果您想返回分配的內存...那么,您必須將其返回。
char *create_memory_pool(int size)
{
char *ptr = malloc(size);
if (ptr != NULL)
{
printf("malloc successful\n");
return ptr;
}
else
{
printf("malloc failed\n");
return NULL;
}
}
但是然后,此函數只需要調用malloc
,因此您可以將其全部刪除。
實際上,一個函數可以返回多個值,但是除一個以外的所有值都必須使用傳遞指針參數:
boolean create_memory_pool(char **ptr, int size)
{
*ptr = malloc(size);
if (*ptr != NULL)
{
printf("malloc successful\n");
return true;
}
...
}
您似乎有些困惑是因為C字符串文字是指針,並且指針用於管理動態內存。 但這並不意味着將字符串文字用於引用動態內存!
您聲稱必須遵守以下原型
boolean create_memory_pool(char *name, int size);
有了這個原型,很明顯, create_memory_pool
不應分配自己的內存,但是調用者有義務提供一塊內存。
相反, create_memory_pool
作用是在塊內創建必要的簿記,使其可以用作內存池(我想可以從中分配較小的固定大小的塊,並在其中原型化不同的功能。標頭。)
/**
* Initialize a memory pool in {@code name}, which has size {@code size}.
*/
boolean create_memory_pool(char *name, int size)
{
// the initial bytes of {@code memory_pool} are the header
struct memory_pool *pool = (struct memory_pool*) name;
initialize stack pool->stack;
divide the remainder of the memory block after the header into blocks of size BLOCK_SIZE and add to the stack pool->stack;
}
/**
* Allocate a block of size {@code BLOCK_SIZE} in the memory pool {@code memory_pool} or return null on failure.
*/
void *alloc_block(char *poolopaque)
{
struct memory_pool *pool = (struct memory_pool*) poolopaque;
pop and return a block from pool->stack or return null;
}
/**
* Return a block of memory into the memory pool.
*/
void free_block(char *poolopaque, void *block)
{
struct memory_pool *pool = (struct memory_pool*) poolopaque;
add block to pool->stack
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.