C++ 中使用 newdelete 和 new[]delete[]

xiaoxiao2025-10-11  7

一、概述

在使用new的时候做了两件事:

1、调用operator new分配空间

2、调用构造函数初始化对象

在使用delete的时候也做了两件事:

1、调用析构函数清理对象

2、调用operator delete函数释放空间

在使用new[N]的时候也做了两件事:

1、调用operator new分配空间

2、调用N次构造函数初始化N个对象

在使用delete[]的时候也做了两件事:

1、调用N次析构函数清理N个对象

2、调用operator delete函数释放空间

二、几个相关问题

在 C++ 中,你也许经常使用 new 和 delete 来动态申请和释放内存,但你可曾想过以下问题呢?

new 和 delete 是函数吗?new [] 和 delete [] 又是什么?什么时候用它们?你知道 operator new 和 operator delete 吗?为什么 new [] 出来的数组有时可以用 delete 释放有时又不行?

具体内容和内部分析请参考:https://blog.csdn.net/hazir/article/details/21413833

问:什么情况下new[]出来的数组可以使用delete释放?

// String 的析构函数 String::~String(void) { delete [] m_data; // 由于m_data 是内部数据类型,也可以写成 delete m_data; } // String 的普通构造函数 String::String(const char *str) { if(str==NULL) { m_data = new char[1]; *m_data = ‘\0; } else { int length = strlen(str); m_data = new char[length+1]; strcpy(m_data, str); } }

上面析构函数内delete m_data不是只释放一个单元么?

不是, 对于 char, int, float…等等内部数据类型, delete 和 delete[] 一样,但对于类就大有不同。

比如 char* p = new char[128]; delete p; 和 delete[] p; 效果一样,p的所有内存都释放了。

delete 和 delete[] 的不同之处在对class 的释放, delete只会调用一个元素的析构函数,而delete[]则调用所有元素的析构。

比如

class t { ~t() {}; }; t* p = new t[128]; delete p;delete[] p

内部都会调用operator delete()释放p的所有(128个)元素, 但 delete是调用了第一个元素的析构, 而delete[] 则是正确的调用128个元素的析构。

总的来说,记住一点即可:new/delete、new[]/delete[] 要配套使用总是没错的!

参考资料: http://blog.51cto.com/11142019/1846844 https://blog.csdn.net/hazir/article/details/21413833 http://www.myexception.org/cpp/556220.html

转载请注明原文地址: https://www.6miu.com/read-5037734.html

最新回复(0)