详解 new 和 delete
目录
一、简要描述两者的作用
二、实例解析
1. 浅层区别
2. 深层区别
三、拓展(operator new 的妙用)
一、简要描述两者的作用
new : 是c++推崇的 内存申请 方式,拥有比 malloc 更先进的机制
delete :是 对应的 内存释放方式,拥有比 free 更先进的机制
二、实例解析
1. 浅层区别
malloc 需要 计算实际需要的 字节数,而 new 则不需要
new 在申请基础类型内存块时,可以对 空间进行初始化 ,malloc 则不会
new 在内存申请失败后 会抛出异常, 而 malloc 则是返回NULL 需要对指针进行 NULL 检查
int main()
{int* arr = (int*)malloc(sizeof(int)*2);if (arr == NULL){cout << "检查后 -- malloc 失败" << endl;return 1;}elsecout << arr[0] << " " << arr[1] << endl;int* arr2 = new int[2] {1, 2};cout << arr2[0] << " " << arr2[1] << endl;return 0;
}
2. 深层区别
在对自定义类型(类,结构体等)进行内存申请时,malloc 同样只是申请对应 字节大小的空间,而 new 则会在申请后,去调用 自定义类型的 构造方法,对其进行初始化
同样 delete 在 释放 空间时 会去调用对应的 析构方法,实现对 类对象的 完全释放,避免成员指针指向空间没有被释放的 泄露问题。
class Test_new_delete
{
public:Test_new_delete(){_arrptr = new int[10] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};cout << "new 主动调用构造方法 " << endl;}~Test_new_delete(){cout << "delete 主动调用析构方法 并对成员指针进行了释放防止内存泄漏 " << endl;delete[] _arrptr;}int* _arrptr;
};
int main()
{Test_new_delete* ptr0 = (Test_new_delete*)malloc(sizeof(ptr0));cout << "malloc 创建的ptr0 没有进行初始化 :" << ptr0->_arrptr << endl;free(ptr0);cout << "free 只是释放了的内存块,但是其中的指针所指向的空间并没有被释放,会造成内存泄露 " << endl;cout << endl << " ----------- " << endl << endl;Test_new_delete* ptr = new Test_new_delete;cout << "malloc 创建的ptr 通过调用构造方法进行初始化 :" << ptr->_arrptr << endl;delete ptr;return 0;
}
三、拓展(operator new 的妙用)
1. 在 调用 new 之后 ,new 内部会去调用 operator new ,库中operator new 再去调用 malloc 进而进行内存申请,但是 operator new 中还会 在申请内存后进行 检查,如果malloc 内存申请失败 则会进行抛异常。
2. 用户可以在类中 对 operator new 进行重载,进而实现 指定类在调用 new 之后 ,去调用 自己实现 的 operator new ,而不调用 库函数,进一步实现 功能的自定义
class ST
{
public :void* operator new(size_t i){cout << "调用自己实现的 operator new" << endl;return (void*) 9;}
};
int main()
{void* ptr = new ST();cout << ptr << endl;return 0;
}