【发布时间】:2019-09-30 08:13:27
【问题描述】:
在调用 free() 之前,我已阅读 this 关于检查的帖子。我想通过一个案例进一步确认。
以下代码是从我的 C++ 项目中复制而来的(经过测试,没有错误/警告)。我只是想确认在 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 部分中,结构包括指针 (p1) 和非指针 (p2)。释放指针、释放非指针和释放两者的组合有什么区别?
如果我使用 delete[ ] 而不是 free()。如何?有什么区别?
【问题讨论】:
-
在 C++ 中,您几乎应该从不使用
malloc和free。如果您需要使用动态分配对象,请尝试使用the standard C++ smart pointers。或者使用new创建对象并使用delete释放它们。 -
@:我应该用什么?
-
这看起来更像 C,你没有使用任何 C++ 特性
-
还要注意
free和delete都处理空指针,之前不需要检查。 -
编写该测试的正确方法是不要这样做。不需要。
标签: c++ error-handling free