有关内存申请与释放问题!

dianhui 2007-05-07 09:11:13
先请大家看下面两个语句,程序运行时,以下两个语句都能正常运行!]
一):
CString temp1;
temp1=new char[1024];
temp1="你好啊!";
MessageBox(temp1);
二):
CString temp2;
temp2="你好啊!";
MessageBox(temp2);

两个CString类型的变量,temp1 temp2。
temp1申请了内存,而temp2没有申请内存,可是他们都能接收付值,程序运行两者都也正常。那么这样的话,temp1的temp1=new char[1024];语句是不是多余?
如果多余为什么很多程序又要用new char来给变量申请内存呢?而不是直接定义一个变量,接着就给该变量付值,不需要申请内存呢。

还有,对于一)temp1这个变量占有的内存,怎么样释放?
...全文
305 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
dianhui 2007-05-09
  • 打赏
  • 举报
回复
steedhorse(晨星) ( ) 信誉:105 Blog 加为好友 2007-5-8 11:24:57 得分: 0

楼上的第4种和第5种都不好,问题跟楼主实质上相同。



//-------------------------
你说的不好,我想问一下,为什么在很多书本实例中,他们又都用到New去申请一块这样的内存呢?
NaturalJ0 2007-05-08
  • 打赏
  • 举报
回复
对,那两种用法应该不对。
晨星 2007-05-08
  • 打赏
  • 举报
回复
楼上的第4种和第5种都不好,问题跟楼主实质上相同。
NaturalJ0 2007-05-08
  • 打赏
  • 举报
回复
1、
CString temp("你好");

2、
CString temp;
temp="你好";

3、
char *temp="你好";

4、
char *temp;
temp=new char[10];
temp="你好";
delete []temp;

5、
char temp[10];
temp="你好";

一般就这几种用法吧
莫情莫钱 2007-05-08
  • 打赏
  • 举报
回复
学习了,还真是不了解NEW的功能
houdongfeng 2007-05-08
  • 打赏
  • 举报
回复
一、是分配了堆内存;
二、是在静态数据区。

晨星 2007-05-07
  • 打赏
  • 举报
回复
To:quantumcat(量子猫)
int a;这种内建内类型的变量只有被定义成全局变量(包括名字空间中的孤立变量)、类域中的静态变量或函数局部域中的静态变量时,才会被初始化成0。但这种习惯上不叫“构造函数”,而叫“值初始化”。
其它的情况下则没有任何初始化,其值是随机的。
这一点许多C++书上都有说明(比如比较畅销的《C++ Primer》、《The C++ Programming Language》等),怎么说没有呢?
晨星 2007-05-07
  • 打赏
  • 举报
回复
temp1=new char[1024];
temp1="你好啊!";
======================
——这样等于直接把刚刚申请的内存给丢弃了,即内存泄露。因为执行
temp1="你好啊!";
之后,temp1不再指向刚刚分配的那块内存,而是指向了一个字面字符串,字面字符串一般保存在程序的常量区中。
当然,你也完全可以利用刚刚申请的内存,而不是指向常量区中的字符串:
temp1=new char[1024];
strcpy(temp1, "你好啊!");
quantumcat 2007-05-07
  • 打赏
  • 举报
回复
[]表示删除的是数组指针,
可能是你中间没加空格发生了错误
我一直在想,像int a这样定义变量是不是像定义类的对象一样也会有自己的构造和析构函数,可惜所有的C++书上都没有这方面的说明;
至于你说的temp1=new char[1024];在你的例子中不需要,两种实现方式过程不一样,但结果一样;
dianhui 2007-05-07
  • 打赏
  • 举报
回复
[]这个什么意思?
刚刚将该语句加进去调试了一下程序,执行
到delete[]temp1语句时发生了错误!
changy 2007-05-07
  • 打赏
  • 举报
回复
delete[]temp1;
changy 2007-05-07
  • 打赏
  • 举报
回复
1.temp1=new char[1024];没必要
2.如果用了new,就要delete
dianhui 2007-05-07
  • 打赏
  • 举报
回复
对不起,刚刚没有注意到类型匹配,现改一下定义!
char *temp1;
temp1=new char[1024];
temp1="你好啊!";
MessageBox(temp1);

char *temp2;
temp2="你好啊!";
MessageBox(temp2);
先请大家看下面两个语句,程序运行时,以下两个语句都能正常运行!]
一):
char *temp1;
temp1=new char[1024];
temp1="你好啊!";
MessageBox(temp1);
二):
char *temp2;
temp2="你好啊!";
MessageBox(temp2);

两个char *类型的变量,temp1 temp2。
temp1申请了内存,而temp2没有申请内存,可是他们都能接收付值,程序运行两者都也正常。那么这样的话,temp1的temp1=new char[1024];语句是不是多余?
如果多余为什么很多程序又要用new char来给变量申请内存呢?而不是直接定义一个变量,接着就给该变量付值,不需要申请内存呢。

还有,对于一)temp1这个变量占有的内存,怎么样释放?也就是delete语句怎么写?
artcpp 2007-05-07
  • 打赏
  • 举报
回复
new是动态申请内存,申请的内存如果不够大,则还可以delete后重新申请。
而CString temp2;
temp2="你好啊!";:由于本人没有学过MFC,怀疑与标准string是类似的实现。将new/delete封装了,所以你看不到。
syy64 2007-05-07
  • 打赏
  • 举报
回复
一、是分配了堆内存;
二、是在静态数据区。
晨星 2007-05-07
  • 打赏
  • 举报
回复
temp1=new char[1024];
temp1="你好啊!";
简直乱套了,一两句解释不请,还是找本C++的书来看看吧。

提示:首先你要明白new char[1024]返回的是一个“char*”类型的指针,然后,你要明白当把一个“char*”类型的指针赋给一个CString对象时会发生什么。
然后你需要明白所有new了不释放的情况全是内存泄露;
最后,还需要明白,CString对象自身会管理自己占用的内存,不会造成内存泄露。但问题是,它只能管好它自己,管不了外边别人new出来的。

16,472

社区成员

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

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

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