如何通过将正确的指针传递给free()来释放函数内的已分配内存

时间:2013-12-02 00:27:55

标签: c memory-management

在函数“create_memory_pool”中,我可以分配内存池,但我不知道如何从主程序中释放它。

我想我错过了如何将正确的指针从函数传递给free,以便释放先前分配的内存。

注意我无法更改传递给函数创建内存池的参数(不允许)。但可以改变功能内的内容。

#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;
}

3 个答案:

答案 0 :(得分:4)

你的函数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根本没有意义。

您应该查看指针的工作原理。

答案 1 :(得分: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,所以你可以将它们全部删除。

实际上,一个函数可以返回多个值的-sort,但除了一个之外的所有值都必须使用pass-by-pointer参数:

boolean create_memory_pool(char **ptr, int size)
{
    *ptr = malloc(size);
    if (*ptr != NULL)
    {
      printf("malloc successful\n");
      return true;
    }
    ...
}

你的一些困惑似乎是因为C字符串文字是指针,而指针用于管理动态内存。但这并不意味着字符串文字用于指代动态内存!

答案 2 :(得分:1)

您声称必须遵守以下原型

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
}