new[]/delete[]与new/delete区别

new[]/delete[]与new/delete完全不同-动态对象数组创建通过new[] 完成-动态对象数组的销毁通过delete[]完成-new[]/delete[]能够被重载,进而改变内存管理方式

new[]/delete[]的重载方式
//static member function
void* operator new[](unsigned int size)
{
    return malloc(size);
}
//static member function
void operator delete[](void* p)
{
    free(p);
}

注意事项:

-new[]实际需要返回的内存空间可能比期望的要多

-对象数组占用的内存中需要保存数组信息(数组的长度,因为编译器要为我们自动的调用构造函数和析构函数,如果不知道这个值,编译器无法知道调用几次构造和析构函数)

-数组信息用于确定构造函数和析构函数的调用次数

动态数组的内存管理

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

class Test
{
private:
    int m_value;
public:

    Test()
    {
        m_value = 0;
    }
    void* operator new(unsigned int size)
    {
        cout << "operator new :" << size <<endl;

        return malloc(size);
    }

    void operator delete(void* p)
    {
        cout << "operator delete:" << p << endl;
        free(p);
    }

    void* operator new[](unsigned int size)
    {
        cout << "operator new[] :" << size <<endl;

        return malloc(size);
    }

    void operator delete[](void* p)
    {
        cout << "operator delete[]:" << p << endl;
        free(p);
    }


};


int main()
{
    Test* pt = NULL;

    pt = new Test;
    delete pt;

    pt = new Test[5];
    delete[] pt;

    return 0;
}

 从打印结果看,new[]实际需要返回的内存空间没有比期望的多,就是20个字节。这是由于编译器的不同而造成的。

new[]/delete[]的重载方式//static member functionvoid* operator new[](unsigned int size){return malloc(size);}
//static member functionvoid operator delete[](void* p){free(p);}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值