簡體   English   中英

如何通過將正確的指針傳遞給free()釋放函數內分配的內存

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM