delete和delete []的疑问

youjun610789338 2015-06-07 12:12:21

new和delete是一对
new[]和delete[]是一对
两者一定要成双成对出现,否则会出错

考虑以下一个问题:
class CMy {

public:
CMy(char* pc) : m_p(pc) {}
~CMy() {
// 释放m_p指向的资源
// delete m_p; or delete []m_p; -- 这里到底用哪个delete合适呢?
}

private:
char* m_p;
};

int main() {
char* pc1 = new char('1');
CMy c1(pc1);

char* pc2 = new char[10];
CMy c2(pc2);

return 0;
}


疑问1:析构函数在释放资源时怎么知道m_p指向的是单个对象还是对象数组呢?
疑问2:如果不知道,那么到底用delete还是用delete []呢???
...全文
153 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 版主 2015-06-08
  • 打赏
  • 举报
回复
delete[]也可以删除new分配的,你这种情况可以都用delete[]
赵4老师 2015-06-08
  • 打赏
  • 举报
回复
new←→delete new[]←→delete[]
pengzhixi 2015-06-08
  • 打赏
  • 举报
回复
使用delete[]还是delete这个是需要程序员自己确定的,c++把内存管理交给程序员就是认为程序员是可以很好的处理这个问题的。你这里的问题在于你把内存的释放从外面移到析构函数里面。而析构函数实际上对析构的内存完全是不知道的,你甚至让他析构栈上的内存。所以你应该把内存的分配和释放都移动到类里面统一管理,要么都放到类外面管理。而不是纠结在析构函数是用delete还是delete[]。
fly_dragon_fly 2015-06-08
  • 打赏
  • 举报
回复
自己分配的指针一定知道用new 或new []的, 成对的释放就可以,至少别人的,那就没办法了
spaceman10 2015-06-07
  • 打赏
  • 举报
回复
if(m_p != NULL) delete m_p;
jiqiang01234 2015-06-07
  • 打赏
  • 举报
回复
使用智能指针,不使用任何delete和delete[]
ID870177103 2015-06-07
  • 打赏
  • 举报
回复
没办法知道,最好的解决方法是不要使用c语言风格的const char *来表示数据串,用类来表示,放弃使用delete[] 你提供的类,具体事项是由你规定的,用哪个你说了算,使用这个类的需要遵守你定下的规范
mxway 2015-06-07
  • 打赏
  • 举报
回复
当m_p是c++语言内置的char(或其它内置类型)型指针时,delete m_p或delete [] m_p的效果一样,不存在内存泄露。但当m_p指向class类型时,delete m_p释放m_p所指地址的第一个元素;而delete []m_p删除m_p所指的一块连续空间。

64,674

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧