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

猜你喜欢

转载自www.cnblogs.com/-glb/p/12296750.html