在 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)
}
问题:
在第 3 部分中,这是检查 if(!params) 的正确方法吗?这里没有考虑任何错误?
在第 6 部分中,我给出了 2 个选项 - if(params) 和 if(params!=NULL)。它们相同吗?
在第1部分中,struct包括指针(p1)和非指针(p2)。释放指针、释放非指针和释放两者的组合有什么区别?
如果我使用 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
/delete
和 new[]
/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]。在您的示例中,可能存在问题,因为参数在堆上而键在堆栈中,当您离开作用域时堆栈将被删除,但参数指针仍可能指向它。
我已阅读 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)
}
问题:
在第 3 部分中,这是检查 if(!params) 的正确方法吗?这里没有考虑任何错误?
在第 6 部分中,我给出了 2 个选项 - if(params) 和 if(params!=NULL)。它们相同吗?
在第1部分中,struct包括指针(p1)和非指针(p2)。释放指针、释放非指针和释放两者的组合有什么区别?
如果我使用 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
/delete
和 new[]
/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]。在您的示例中,可能存在问题,因为参数在堆上而键在堆栈中,当您离开作用域时堆栈将被删除,但参数指针仍可能指向它。