在 malloc 之后和调用 free() 之前检查

Check after malloc & before calling free()

我已阅读 this post 关于调用 free() 之前的检查。我想通过一个案例进一步确认。

以下代码是从我的C++项目中复制过来的(经过测试,没有error/warning)。我只是想确认在 C++ 中检查 内存分配 free() 的正确方法。

// part 1: declare 
typedef struct cipher_params_t {
    unsigned char * p1;     
    int p2;                 
}cipher_params_t;

// part 2: allocate memory
cipher_params_t *params = (cipher_params_t*)malloc(sizeof(cipher_params_t));

// part 3: check allocate memory
if (!params) {
    /* Unable to allocate memory on heap*/
    fprintf(stderr, "ERROR: malloc error: %s\n", strerror(errno));
    return errno;
}

// part 4: assign values
unsigned char key[16] = {0x01, 0x02, ..., 0x0f};
params -> p1 = key;
params -> p2 = 1;

// part 5: use params for some function
some_func(params);

// part 6: free params lastly
cleanup1(params);
// cleanup2(params); //another option

void cleanup1 (cipher_params_t *params){
    if(params) free(params)
}

void cleanup2 (cipher_params_t *params){
    if(params!=NULL) free(params)
}

问题:

  1. 在第 3 部分中,这是检查 if(!params) 的正确方法吗?这里没有考虑任何错误?

  2. 在第 6 部分中,我给出了 2 个选项 - if(params) 和 if(params!=NULL)。它们相同吗?

  3. 在第1部分中,struct包括指针(p1)和非指针(p2)。释放指针、释放非指针和释放两者的组合有什么区别?

  4. 如果我使用 delete[ ] 而不是 free()。如何?有什么区别?

In part 3, is this the correct way to check if(!params). Any error is not considered here?

是的,这是正确的,因为 malloc() returns 失败时为 NULL。

In part 6, I give 2 options - if(params) and if(params!=NULL). Are they same?

是的,它们是一样的。但在 C++ 中,有几个原因需要使用 nullptr(正确的类型 nullptr_t)而不是 NULL。

In part 1, struct includes pointer(p1) and non-pointer(p2). What is the difference between free a pointer, free a non-pointer, and free a combination of both?

事实上,你不会也不能释放一个非指针。在你的例子中,你只释放了一个指向 cipher_params_t 结构的指针。
使用 malloc() 你分配内存来包含 cipher_params_t 无论内容是什么,你只需分配足够的 space 来包含它。当你free(),你释放分配的内存,不管结构包含什么。
请注意 malloc()free() 不调用 contructors/destructors,既不是针对指向的结构,也不是针对它的内容。它们只是 reserving/allocating 记忆 space.

If I use delete[ ] instead of free(). How? and what's the difference?

切勿混用 malloc()/free()new/deletenew[]/delete[],因为它们不一样。您应该阅读 What is the difference between new/delete and malloc/free? 了解更多信息。

关于问题:

In part 1, struct includes pointer(p1) and non-pointer(p2). What is the difference between free a pointer, free a non-pointer, and free a combination of both?

在您提供的示例中,您正在从堆内存中删除一个结构。这个结构有一个指针(假设 8 个字节)和一个 int(通常是 4 个字节),所以你删除了这块内存(12 个字节),没有别的。

指针指向的内存将保留在那里,因此不会触及键[16]。在您的示例中,可能存在问题,因为参数在堆上而键在堆栈中,当您离开作用域时堆栈将被删除,但参数指针仍可能指向它。