⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_46608.htm

📁 一些关于vc的问答
💻 HTM
字号:
<p>
序号:46608 发表者:米罗 发表日期:2003-07-11 20:27:04
<br>主题:大侠帮忙:关于内存分配和释放的问题
<br>内容:1. 我在写一个程序使用内存分配(自己写的类是在类构造时分配空间),分配时没错,可是释放(是在类析构时)就出错。我把析构时的代码去掉就没事了,是怎么回事那?难道分配的内存不用释放?<BR>我用的是win2000,编译环境是VC6.0。<BR>局部代码如下:<BR>template &lt;class Type&gt;<BR>CSqList&lt;Type&gt;::CSqList(void)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;//elem是一个Type类型的指针,是个私有变量<BR>&nbsp;&nbsp;&nbsp;&nbsp;elem=(Type *)malloc(LIST_INIT_SIZE*sizeof(Type));<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(!elem) <BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(NULL,"内存不足!!!","程序错误",MB_OK);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;ListSize=LIST_INIT_SIZE;<BR>&nbsp;&nbsp;&nbsp;&nbsp;Length=0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;IsSort=0;<BR>}<BR><BR>template &lt;class Type&gt;<BR>CSqList&lt;Type&gt;::~CSqList()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//free(elem);<BR>}<BR>2. new和malloc有什么区别,他们具体是怎么实现的?<BR>3. 内存的分配是不是和所用的操作系统有关,希望详解。
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:米罗 回复日期:2003-07-11 20:28:16
<br>内容:sorry,忘调整分数了。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;◎^_^◎
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Apollo.Wu 回复日期:2003-07-11 22:50:14
<br>内容:你不应该用(!elem)来判断是否分配了内存,指针应该用NULL,不应该是bool型.<BR>new 和 malloc的实现方式很少有人能说清楚,不过使用方法差不多,只是new/delete更符合OOP编程习惯和使用更灵活.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:米罗 回复日期:2003-07-11 22:57:32
<br>内容:NULL在windows的定义就是0,所以可以写成这样。<BR>对了,还有个问题,就是在类构建时如果出现错误,怎样捕获呢?<BR>我只是用了MessageBox,没有真正捕获。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:野猫 回复日期:2003-07-12 01:26:34
<br>内容:To 1楼:<BR><BR>1.我试了一下,没有出错<BR>2.建议尽量使用new/delete,因为new可以自动调用构造函数,malloc不行,同样,delete可以自动调用析构函数,free不行。<BR>3.不知道<BR><BR>To 3楼:<BR><BR>可以写成(!elem)的形式,但不提倡。<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:米罗 回复日期:2003-07-12 20:41:42
<br>内容:请问四楼的兄弟你是怎么测试的?只是编译没有错误吗?<BR>要是这样可不行。<BR>我在算符重载时,它调用了析构函数,这时出现错误(就是free()函数出错),我想知道怎么回事?<BR>+重载如下:<BR>template &lt;class Type&gt;<BR>CSqList&lt;Type&gt; CSqList&lt;Type&gt;::operator+(CSqList &amp;B) //+运算符操作<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;int Len;<BR>&nbsp;&nbsp;&nbsp;&nbsp;Len=Length+B.Length;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CSqList temp(Len);<BR>&nbsp;&nbsp;&nbsp;&nbsp;memcpy(temp.elem,elem,Length*sizeof(Type));<BR>&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&amp;(temp.elem[Length]),B.elem,B.Length*sizeof(Type));<BR>&nbsp;&nbsp;&nbsp;&nbsp;temp.Length=Len;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;return temp;<BR>}<BR>比如运行a=a+b时,它调用了析构函数,然后就出错了!怎么回事?<BR><BR>对于new和delete自动调用析构函数,我想知道是调用谁的析构函数?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:野猫 回复日期:2003-07-13 00:31:16
<br>内容:关于测试,运行没问题(就你贴出部分),析构不会出错。<BR><BR>new/delete:<BR><BR>new (Type); //Type若不是内部数据类型,即是你自己编的,就会自动调用Type的构造函数。<BR><BR>a = a + b :<BR><BR>你重载了"="号没有?任意一个类A,缺省的赋值函数 :A &amp; operate =(const A &amp;a);&nbsp;&nbsp;<BR><BR>看你的定义,elem是个指针,这样,当进行类似a = b这样的操作时<BR><BR>实际上进行了a.elem = b.elem操作 ... 你析构b,ok,没问题,再析构a ...当当当当<BR><BR>出错了。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:xuqdy 回复日期:2003-07-14 00:09:22
<br>内容:malloc是C语言里使用的内存分配方式,而new则是C++里使用的内存分配方式,当然在C++里用malloc也可以,只是不提倡
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:米罗 回复日期:2003-07-16 20:36:57
<br>内容:不好意思,网络故障一直没法上网,我现在在网吧里上,哈哈!<BR><BR>关于野猫同志说的我知道,我只需要重载+预算符就够用了,呵呵!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:野猫 回复日期:2003-07-17 15:07:45
<br>内容:你还是不明白我说的,看你的程序<BR>template &lt;class Type&gt;<BR>CSqList&lt;Type&gt; CSqList&lt;Type&gt;::operator+(CSqList &amp;B) //+运算符操作<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;int Len;<BR>&nbsp;&nbsp;&nbsp;&nbsp;Len=Length+B.Length;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CSqList temp(Len);<BR>&nbsp;&nbsp;&nbsp;&nbsp;memcpy(temp.elem,elem,Length*sizeof(Type));<BR>&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&amp;(temp.elem[Length]),B.elem,B.Length*sizeof(Type));<BR>&nbsp;&nbsp;&nbsp;&nbsp;temp.Length=Len;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;return temp;<BR>}<BR><BR>a = a + b实际上做了 a = temp这样的操作<BR><BR>由于你没有重载operator=,所以a.elem = temp.elem<BR><BR>temp被系统自动析构了,你说a的下场会是怎样呢?<BR><BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:米罗 回复日期:2003-07-21 20:35:49
<br>内容:抱歉,一直没法上网!<BR>我知道你说的意思,我的意思是不用重载=运算符也可以处理的。<BR>我已经解决了,谢谢你的帮助!!!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -