最近在阅读别人的代码:
在一个自定义类中,这样定义了一个 指针类型成员数据:
BYTE* m_pComBuffer;
在构造函数中,初始化为:
mpComBuffer= new BYTE[1024]
在析构函数中,释放空间
delete[] m_pComBuffer;
想请问哪位老师,
1.这样用有什么好处,是否能够有效的节约内存资源,是否因为它是动态分配内存空间。
2.delete[]表示了什么,如果去掉"[]",build也会通过,但是有没有错呢?谢谢您的指导。
在一个自定义类中,这样定义了一个 指针类型成员数据:
BYTE* m_pComBuffer;
在构造函数中,初始化为:
mpComBuffer= new BYTE[1024]
在析构函数中,释放空间
delete[] m_pComBuffer;
想请问哪位老师,
1.这样用有什么好处,是否能够有效的节约内存资源,是否因为它是动态分配内存空间。
2.delete[]表示了什么,如果去掉"[]",build也会通过,但是有没有错呢?谢谢您的指导。
解决方案 »
- API创建的edit用什么风格才会有凹下去的视觉效果?
- visual c++6.0的问题
- 数据库中类似于GOOGLE搜索功能怎么实现?
- 在线等:如何解决unkown charater '0xa1'错误!
- 急问:关于资源查找的问题?
- unresolved external symbol问题...
- 招聘软件工程师,欢迎应届毕业生
- 请问,怎样vc中要实现解压缩cab文件到指定目录(代码不是用winrar等工具)
- 急急急:Unhandled execption in my.exe(riched20.dll:0x0000005:Access Violation)
- 文档类中如何调用Dlg绑定的控件
- 谁能给我通俗的说一下CALLBACK函数是怎么一会事?
- 请问:关于jrtplib的example2的一个问题!
delete mpComBuffer只释放mpComBuffer指针本身所占用的缓冲区
2.[]是必须的,这样才能释放所有分配给m_pComBuffer的内存;如果是这样:
delete m_pComBuffer;
那只能释放掉pComBuffer数组的第一个字节的内存,造成内存泄漏
3.最好后面再加上一句:pComBuffer = NULL;
这样pComBuffer就不会成为野指针
这样pComBuffer就不会成为野指针指针是类成员,析构函数执行完成后便灰飞烟灭了,何来野指针?
char * m_pComBuffer = new BTYE[1024];的好处就是,在你的类中经常需要动态的分配较大的内存空间,效率当然会降低了,所以预先开辟一片内存缓冲区,给所有的类成员函数使用!
但最好不要使用这种'无谓'的动态类型,因为大多情况下,你将需要重载该类的赋值运算符及复制构造函数
请问在对象没有析构之前,如果你在delete []m_pComBuffer之后,因为某些原因忘了该指针指向的内存已经释放,而继续使用该变量,会出现什么结果呢?一般的情况是先判断一下该变量是否为空:if (!pComBuffer){},可想而知,这时候会出现什么结果!
delete[] 删除所有的分配空间
而且既然delete[] 是删除所有的分配空间,那么自然调用所有对象的析构函数^_^
if(m_pAnotherObject)
{
delete m_pAnotherObject;
m_pAnotherObject=NULL;
}
或其它类似的语句, delete mpComBuffer; 还是delete []mpComBuffer就有极大的区别了.
看过前面的delete表达式,你可能会问,如果pi因为某种原因被设置为0又会怎么样呢?代码不应该像这样吗?
// 这样做有必要吗?
if ( pi != 0 )
delete pi;
答案是不。如果指针操作数被设置为0,则C++会保证delete表达式不会调用操作符delete()。
if(m_pComBuffer!=NULL)
{
delete[] m_pComBuffer;//delete m_pComBuffer[]也可以
m_pComBuffer=NULL;
}
int *p = new int[1];
//
这时释放p用delete[]p和delete p都一样。如果对象不止一个,就必须以数组形式与之对应
因为刚刚laiyiling兄的回复跟上面还是不一样的。
你究竟信谁?我一直以为的也正如上面陈述的:
“delete 删除一个空间
delete[] 删除所有的分配空间”但从诸位牛牛的回复中思考了一下,又去做了个小试验
发现问题严重了。
这跟课本上讲的、跟我一直认为的都有所不同了!!
正在试验中……