关于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 问题有点多~~先谢啦
...全文
162 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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;

16,548

社区成员

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

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

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