c++: new, delete, malloc, free的匹配使用

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

参考链接

  1. new: http://www.cplusplus.com/reference/new/operator%20new/
  2. delete: http://www.cplusplus.com/reference/new/operator%20delete/
  3. free: http://www.cplusplus.com/reference/cstdlib/free/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值