关于New Delete的疑问

shihaojie1219 2009-08-13 11:08:38
第一个疑问:
int *a;
a=new int;
那么之后如何把数据放入a指向的内存里呢?

第二个疑问:
struct CFGINF
{
int flag;
CString szTitle;
CString szPath;
};
struct CFGINF * cfginf;
cfginf=new cfginf;
CfgInf->flag=1;
CfgInf->szTitle=m_szEdittitle;
CfgInf->szPath=m_szEditpath;
这是如何把相应的值放到new出来的内存里的呢?而且为什么不需要我用delete把new的内存释放呢?

第三个疑问:
有一个CPtrList类的对象,当用removeat函数移除某一个节点后,为什么又需要用delete把节点指向的内存释放?
(我知道这样是防止内存泄露,我不理解的是什么时候要用delete,为什么有的时候不用)
:-D 问题有点多~~先谢啦
...全文
106 点赞 收藏 14
写回复
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
shihaojie1219 2009-08-14
[Quote=引用 7 楼 tttyd 的回复:]
你看的什么书?
new出来的对象可能在其他地方delete了,不一定是在同一个函数甚至在同一个文件中new、delete成对的。
所有的代码你都研究过了?
[/Quote]
嗯,我也知道有这种情况。
但对于我看的书肯定是不严谨,比如有的地方在一个消息响应函数里:
C***::*****()
{
while(****)
{
abc=new DFG; //abc为类的成员变量(DFG *abc),DFG 为结构体
abc.***=***;
……
}
}
while会执行好几个循环,如果不在while循环末尾加上delete,那么不是每执行一次while就有一段内存new出来而没法释放了吗?难道在别的地方还能释放?
PS:我读的书是Visual C++项目开发实践(李强 贾云霞编著)、Visual C++6.0项目开发指南(武装 张碧霞编著)在图书馆找的,很老,2003年出版的。大家能不能推荐些类似的比较新的书啊。 谢谢啦!
回复
pady_pady 2009-08-14
[Quote=引用 12 楼 shihaojie1219 的回复:]
引用 7 楼 tttyd 的回复:
你看的什么书?
new出来的对象可能在其他地方delete了,不一定是在同一个函数甚至在同一个文件中new、delete成对的。
所有的代码你都研究过了?

嗯,我也知道有这种情况。
但对于我看的书肯定是不严谨,比如有的地方在一个消息响应函数里:
C***::*****()
{
while(****)
{
abc=new DFG; //abc为类的成员变量(DFG *abc),DFG 为结构体
abc.***=***;
……
}
}
while会执行好几个循环,如果不在while循环末尾加上delete,那么不是每执行一次while就有一段内存new出来而没法释放了吗?难道在别的地方还能释放?
PS:我读的书是Visual C++项目开发实践(李强 贾云霞编著)、Visual C++6.0项目开发指南(武装 张碧霞编著)在图书馆找的,很老,2003年出版的。大家能不能推荐些类似的比较新的书啊。 谢谢啦!
[/Quote]

呵呵,如果书上那么写,就有问题了,功能上没问题,但是内存泄露了
回复
pady_pady 2009-08-14
如果你用CArray 或CList就不用显式调用delete 了,这两个类 类似vector和list,其它的几个结构保存的都是指针,如果你的数据是在外面new的,必须显式删除
回复
雪影 2009-08-13
[Quote=引用 9 楼 wltg2001 的回复:]
new出来的对象可能在其他地方delete了,不一定是在同一个函数甚至在同一个文件中new、delete成对的。
=================
一般原则是在一个函数里new的,最好在同一个函数里delete,否则也有可能出问题,不过只是有可能吧,其实,你就是只new,不delete,对于一些小应用来说,也没有什么问题,问题一般都是出在一些对资源要求很大的地方。
[/Quote]
对于一些类成员指针来说,可能在某些函数中new,而在析构函数中delete
回复
副组长 2009-08-13
写书的好多也都是七拼八凑,有些著书的还比较严禁,有些编书的就是凑篇幅骗点钱花的。
回复
wltg2001 2009-08-13
new出来的对象可能在其他地方delete了,不一定是在同一个函数甚至在同一个文件中new、delete成对的。
=================
一般原则是在一个函数里new的,最好在同一个函数里delete,否则也有可能出问题,不过只是有可能吧,其实,你就是只new,不delete,对于一些小应用来说,也没有什么问题,问题一般都是出在一些对资源要求很大的地方。
回复
wltg2001 2009-08-13
导致我困惑的原因主要是我在看两本VC++编程的书,上面new出的内存都没有delete掉
===============================
new出来的东西都是要delete的。有些书写的时候不严谨也是有的。
回复
雪影 2009-08-13
你看的什么书?
new出来的对象可能在其他地方delete了,不一定是在同一个函数甚至在同一个文件中new、delete成对的。
所有的代码你都研究过了?
回复
shihaojie1219 2009-08-13
“removeat只是将结点移出来,结点不用了当然要delete。总之一句话,new出来的一定要delete,这两个是配对的。”

这个我听说了很多遍啊:-D
导致我困惑的原因主要是我在看两本VC++编程的书,上面new出的内存都没有delete掉,而removeat后就用delete了,所以我就以为……难道这些书的代码不规范啊!
回复
wltg2001 2009-08-13
第二个疑问:
struct CFGINF
{
int flag;
CString szTitle;
CString szPath;
};
struct CFGINF * cfginf;
cfginf=new cfginf;
CfgInf->flag=1;
CfgInf->szTitle=m_szEdittitle;
CfgInf->szPath=m_szEditpath;
这是如何把相应的值放到new出来的内存里的呢?而且为什么不需要我用delete把new的内存释放呢?
==========
上面不是已经赋值了吗?CfgInf->flag=1,这不就行了,另外new出来的东西不用时是一定要delete的。
第三个问题更简单,removeat只是将结点移出来,结点不用了当然要delete。总之一句话,new出来的一定要delete,这两个是配对的。
回复
雪影 2009-08-13
1. 对指针a指向的int赋值 *a=1;
2. 你已经将某些值放到你new出来的空间里了。另外用完之后你需要delete cfginf
3. CPtrList链表中保存的只是指针的值,没有保存各个指针指向的内存空间,因此不会去释放指针指向的内存空间。所以在删除CPtrList节点之前,需要将节点指向的内存空间delelte
回复
healer_kx 2009-08-13
第三个疑问:
有一个CPtrList类的对象,当用removeat函数移除某一个节点后,为什么又需要用delete把节点指向的内存释放?
(我知道这样是防止内存泄露,我不理解的是什么时候要用delete,为什么有的时候不用)
:-D 问题有点多~~先谢啦

都是要用的,
回复
healer_kx 2009-08-13
第二个疑问:
struct CFGINF
{
int flag;
CString szTitle;
CString szPath;
};
struct CFGINF * cfginf;
cfginf=new cfginf;
CfgInf->flag=1;
CfgInf->szTitle=m_szEdittitle;
CfgInf->szPath=m_szEditpath;
这是如何把相应的值放到new出来的内存里的呢?而且为什么不需要我用delete把new的内存释放呢?


谁说不需要啊?
最后你不用的时候,还是要
delete cfginf;的。
回复
healer_kx 2009-08-13
第一个疑问:
int *a;
a=new int;
那么之后如何把数据放入a指向的内存里呢?

*a = 1;
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告