cplusplus: new, delete, malloc, free的匹配使用
今天师姐项目调试时遇到问题, 跑来问我:
为什么用new申请的内存, 用free释放有时候没问题, 有时候又有问题呢?
在C++中, 我们可以用new和malloc申请空间, 用delete和free释放空间。
malloc和free只对内存块进行操作, 而new和delete除了对内存块进行操作,
还会调用构造/析构函数(如果是类空间)。
而类里的成员变量, 可能是指针或句柄, 其实际指向的资源, 并不在类的内存块中。
这时贸然使用free释放, 就会产生内存泄露。
当然, 如果内存块中存储的是基本数据类型, 使用delete和free都不会有内存泄露。
只是这样的写法并不规范。
规范的写法是:
new与delete, new[]与delete[], malloc和free对应使用。
示例代码
使用VLD检测内存泄露,情况3存在内存泄漏
#include <cstdlib>
#include <iostream>
#include <vld.h>
#pragma comment(lib, "vld.lib")
class Hand
{
public:
void* handle;
Hand() : handle(nullptr) {}
~Hand() { if (handle != nullptr) free(handle); }
void memory() { if (handle == nullptr) handle = malloc(100); }
};
int main()
{
// condition 1: malloc and free
{
Hand* handle = reinterpret_cast<Hand*>(malloc(sizeof(Hand)));
free(handle);
}
// condition 2: new and free (without memory)
{
Hand* handle = new Hand();
free(handle);
}
// condition 3: new and free (with memory allocation)
{
Hand* handle = new Hand();
handle->memory();
free(handle);
}
}