C++基础问题提问,请教基础扎实的老师

zhwang_1999 2005-11-18 02:15:14
最近在阅读别人的代码:
在一个自定义类中,这样定义了一个 指针类型成员数据:
BYTE* m_pComBuffer;
在构造函数中,初始化为:
mpComBuffer= new BYTE[1024]
在析构函数中,释放空间
delete[] m_pComBuffer;


想请问哪位老师,
1.这样用有什么好处,是否能够有效的节约内存资源,是否因为它是动态分配内存空间。
2.delete[]表示了什么,如果去掉"[]",build也会通过,但是有没有错呢?

谢谢您的指导。
...全文
376 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhwang_1999 2005-11-22
  • 打赏
  • 举报
回复
谢谢各位的关心,
谢谢教导,
这使我有个基本的认识了
谢谢
Kudeet 2005-11-22
  • 打赏
  • 举报
回复
我认为delete[]和delete只有在动态申请一个对象空间时才没有区别,其他的时候都是不同的。
int *p = new int[1];
//
这时释放p用delete[]p和delete p都一样。如果对象不止一个,就必须以数组形式与之对应
kelinwang19 2005-11-22
  • 打赏
  • 举报
回复
在析构函数中,释放空间为安全期间最好是
if(m_pComBuffer!=NULL)
{
delete[] m_pComBuffer;//delete m_pComBuffer[]也可以
m_pComBuffer=NULL;
}

guosx 2005-11-22
  • 打赏
  • 举报
回复
学习,不过有点晕
Featured 2005-11-22
  • 打赏
  • 举报
回复
楼主,你的认识可能是错误的。
因为刚刚laiyiling兄的回复跟上面还是不一样的。
你究竟信谁?

我一直以为的也正如上面陈述的:
“delete 删除一个空间
delete[] 删除所有的分配空间”

但从诸位牛牛的回复中思考了一下,又去做了个小试验
发现问题严重了。
这跟课本上讲的、跟我一直认为的都有所不同了!!
正在试验中……

perfervid 2005-11-22
  • 打赏
  • 举报
回复
C++ Primer中有这样的描述:
看过前面的delete表达式,你可能会问,如果pi因为某种原因被设置为0又会怎么样呢?代码不应该像这样吗?
// 这样做有必要吗?
if ( pi != 0 )
delete pi;
答案是不。如果指针操作数被设置为0,则C++会保证delete表达式不会调用操作符delete()。
Zark 2005-11-21
  • 打赏
  • 举报
回复
对于mpComBuffer= new BYTE[1024]; 来说无论是 delete mpComBuffer; 还是delete []mpComBuffer;都是释放所有的申请空间,没有什么"delete 删除一个空间 delete[] 删除所有的分配空间"这种说法.

MackZ说"delete[]和delete对于简单数据类型没有区别",是因为简单数据(或应说内部型数据,build-in date type)是没有析构的,所以没有问题. 如果是用户定义类型(也就是类),如果它的析构函数没有什么特别之处,这两种写法在实际情况下也是没有什么区别,但是如果析构函数中有诸如:
if(m_pAnotherObject)
{
delete m_pAnotherObject;
m_pAnotherObject=NULL;
}
或其它类似的语句, delete mpComBuffer; 还是delete []mpComBuffer就有极大的区别了.

Featured 2005-11-21
  • 打赏
  • 举报
回复
delete[]和delete对于简单数据类型没有区别;对于类就有区别,因为delete只会调用一次析构函数,而delete[]会调用每一个成员的析构函数。因此,分配内存和释放内存的时候,如果用了new TYPE[]来释放,最好用delete[]来释放,这是一个良好的习惯。

=====

错了吧? 是有区别的!
而且既然delete[] 是删除所有的分配空间,那么自然调用所有对象的析构函数^_^
srxumin 2005-11-19
  • 打赏
  • 举报
回复
Mackz真是一针见血,“扎实”
Zark 2005-11-19
  • 打赏
  • 举报
回复
就以上各贴看来,仅Mackz是“基础扎实的老师”。
Snow_Ice11111 2005-11-18
  • 打赏
  • 举报
回复
楼上各位解释得真详细,学习了!
菜牛 2005-11-18
  • 打赏
  • 举报
回复
delete[]和delete对于简单数据类型没有区别;对于类就有区别,因为delete只会调用一次析构函数,而delete[]会调用每一个成员的析构函数。因此,分配内存和释放内存的时候,如果用了new TYPE[]来释放,最好用delete[]来释放,这是一个良好的习惯。
xqk 2005-11-18
  • 打赏
  • 举报
回复
楼上的说的好啊,帮我补充了一下,喉喉
freemme 2005-11-18
  • 打赏
  • 举报
回复
对不起,没有看到是指在析构函数中释放,这样是不存在野指针的问题。
Pipi0714 2005-11-18
  • 打赏
  • 举报
回复
不存在也指针的问题,他是析够函数!不用数组用指针差不多对于你这个程序来说!分配内存空间特别大推荐用指针.

delete 删除一个空间
delete[] 删除所有的分配空间
freemme 2005-11-18
  • 打赏
  • 举报
回复
楼上的,你好!
请问在对象没有析构之前,如果你在delete []m_pComBuffer之后,因为某些原因忘了该指针指向的内存已经释放,而继续使用该变量,会出现什么结果呢?一般的情况是先判断一下该变量是否为空:if (!pComBuffer){},可想而知,这时候会出现什么结果!
xqk 2005-11-18
  • 打赏
  • 举报
回复
3.最好后面再加上一句:pComBuffer = NULL;
这样pComBuffer就不会成为野指针

指针是类成员,析构函数执行完成后便灰飞烟灭了,何来野指针?


char * m_pComBuffer = new BTYE[1024];

的好处就是,在你的类中经常需要动态的分配较大的内存空间,效率当然会降低了,所以预先开辟一片内存缓冲区,给所有的类成员函数使用!


但最好不要使用这种'无谓'的动态类型,因为大多情况下,你将需要重载该类的赋值运算符及复制构造函数
freemme 2005-11-18
  • 打赏
  • 举报
回复
1.这样用很灵活,因为有些地方需要到声明的后面才知道需要分配多少内存。
2.[]是必须的,这样才能释放所有分配给m_pComBuffer的内存;如果是这样:
delete m_pComBuffer;
那只能释放掉pComBuffer数组的第一个字节的内存,造成内存泄漏
3.最好后面再加上一句:pComBuffer = NULL;
这样pComBuffer就不会成为野指针
nZAI 2005-11-18
  • 打赏
  • 举报
回复
delete[] mpComBuffer释放mpComBuffer所指向的整个缓冲区
delete mpComBuffer只释放mpComBuffer指针本身所占用的缓冲区

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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