new与delete??

angelcool 2005-04-29 03:49:47
《高质量C++/C编程指南》中说:
内存分配方式有三种,其中从堆上分配方式为:程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。


String::String(const String &other)
{
// 允许操作other的私有成员m_data
int length = strlen(other.m_data);
m_data = new char[length+1];
strcpy(m_data, other.m_data);
}
这里用new为m_data 申请了内存,并在析构函数里释放该内存。

我在自己的程序中
char * RecBuf = new char[12];
memset(RecBuf,0,12);
memcpy(RecBuf,(char *)lParam,12);
但是我绝对不能在这个程序中delete RecBuf,否则就会出错。
这是个局部变量,不在这里释放内存岂不是就无法释放了。
困惑ing!!
...全文
122 点赞 收藏 18
写回复
18 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
bing_huo 2005-04-29
怎么不好??


就是说 分配和释放 放在不同的代码块里感觉比较别扭喽 更容易出错(比如忘记释放) 同时 增加维护难度
回复
angelcool 2005-04-29
to xzgyb(老达摩)
但感觉这样不太好
------------------------
怎么不好??
回复
xzgyb 2005-04-29
哦,已经改了,呵
回复
xzgyb 2005-04-29
::PostMessage(m_pASServerView,WM_SEND_MSG,(WPARAM)pRec,(LPARAM)RecBuf);
PostMessage调用立刻返回
那RecBuf的释放就要在响应WM_SEND_MSG的函数中释放了


void OnSendMsg(WPARAM wParam, LPARAM lParam)
{
char* pBuf = (char *)RecBuf;
...
delete[] pBuf;
}

但感觉这样不太好
回复
angelcool 2005-04-29
我这样修改了就OK了
delete [] (char *)wParam;
delete [] (char *)lParam;

回复
Cnwanglin 2005-04-29
用strcpy
回复
piaozi2003 2005-04-29
看了这么多都不明白楼主的意思?不是我蠢就是楼主的表达能力有问题,二者必占其一
回复
Cnwanglin 2005-04-29
可以把你的代码多贴些上来吗?
===========================
回复
angelcool 2005-04-29
to useresu(俗人)
我的程序代码是这样的:
char * RecBuf = new char[nMsgSize];
memset(RecBuf,0,nMsgSize);
memcpy(RecBuf,(Message_Param *)lParam,nMsgSize);
::PostMessage(m_pASServerView,WM_SEND_MSG,(WPARAM)pRec,(LPARAM)RecBuf);

我在传递RecBuf时将它转换为LPARAM,不能作为一个指针被释放了。应该怎样做呢?
回复
beyondtkl 2005-04-29
.
回复
zhangfjj 2005-04-29
to junguo(junguo)
我是要将它作为参数传给其他函数去处理,那应该怎样做呢?
===========
在堆内存申请的内存,始于申请(new),止于delete,你没有delete之前,可把它视为一个全局变量(当然,它的开始是始于申请(new),这一点是不同于全局变量的。




为了防止内存泄漏,一定要记住及时释放。在哪个函数中用完后不再用了,就要释放了!
回复
useresu 2005-04-29
如果你要传参,可以把char * RecBuf 指针传过去,
然后在传到的函数delete[]
但是一定要记得delete啊
回复
useresu 2005-04-29
最好是用完及时释放,
把堆空间传参是不很的习惯,
当然如果是可以在类的析构函数释放是可以的.

否则容易导致内存泄露,
回复
angelcool 2005-04-29
to junguo(junguo)
我是要将它作为参数传给其他函数去处理,那应该怎样做呢?
回复
junguo 2005-04-29
怎么可能无法释放呢?你在该段程序的最后释放不就好了!

如果你想把它作为参数返回调用函数,就不应通过这种方式来处理。可以采用传值的方式来解决。

总之,肯定有释放的方法!
回复
useresu 2005-04-29
可以在这里释放啊,
如果你不使用RecBuf,当然可以释放,
但是一定注意,释放后,就不能在memcpy(RecBuf,,)了
回复
zhangfjj 2005-04-29
但是我绝对不能在这个程序中delete RecBuf,否则就会出错。

不明白你说的,绝对不能?出了什么错呢
回复
zhangfjj 2005-04-29
我在自己的程序中
char * RecBuf = new char[12];
memset(RecBuf,0,12);
memcpy(RecBuf,(char *)lParam,12);
但是我绝对不能在这个程序中delete RecBuf,否则就会出错。
==========为什么会出错?在使用完这些堆内存后,应该及时释放,大家都这么用。


这是个局部变量,不在这里释放内存岂不是就无法释放了。
========这就是内存泄漏呀
困惑ing!!
回复
发动态
发帖子
C++ 语言
创建于2007-09-28

5.9w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
社区公告
暂无公告