📄 subject_55506.htm
字号:
<p>
序号:55506 发表者:走上vc的路 发表日期:2003-10-10 13:19:58
<br>主题:疑惑: 结构,类 的大小,以及内存的分配与删除
<br>内容:GROUP_STR *pTemp = new GROUP_STR [groupno + 1];<BR>memset(pTemp, 0, sizeof(GROUP_STR) * (groupno+1));<BR>if(pGroup) <BR>{<BR> memcpy(pTemp, pGroup, sizeof(GROUP_STR) * groupno);<BR> delete []pGroup;<BR>}<BR><BR>说明:GROUP_STR 是一个结构体,定义如下:<BR>struct GROUP_STR {<BR> char groupname[MAX_USERNAME];<BR> GROUPUSER *nameid;<BR> int nameno;<BR> int groupexist;<BR>};<BR>问题:在上面的代码中,new分配内存的时候是怎么分配的?他的nameid成员给分内存了吗?那后面的memcpy函数,sizeof(GROUP_STR)是怎么算的?delete函数可以直接这么删除结构吗?难道不需要线删除它的成员nameid所分配的空间?
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:luo 回复日期:2003-10-10 14:14:30
<br>内容:nameid分配内存了,但是分配的只是四个字节的用来存放指针的内存,不是你所理解的那样。这时候的nameid是个无效指针(并不是NULL),你需要自己为它分配内存。<BR>sizeof(GROUP_STR)在计算的时候,nameid只是占四个字节而已。<BR>你这样删除是不行的,如果你没有为nameid分配有效的内存,有没有置成空指针的话,会报错的。如果你为它分配了内存就要先删除它。<BR>最好把GROUP_STR定义为类,或者也可以在结构中为这个结构定义构造、析构函数。<BR>struct GROUP_STR<BR>{<BR>//成员相同;<BR>GROUP_STR()<BR>{<BR>memset( this, 0, sizeof( GROUP_STR );<BR>}<BR>~GROUP_STR()<BR>{<BR> if ( nameid )<BR> delete nameid;<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>
回复者:走上vc的路 回复日期:2003-10-10 15:50:53
<br>内容: 我我我好像明白了:结构体的大小并不包括它的指针成员所指向的内存,它只是提供一点点内存(4个字节)来存放指针本身而已,memcpy拷贝了指针本身,是这样吗?<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>
<font color=red>答案被接受</font><br>回复者:luo 回复日期:2003-10-10 15:54:27
<br>内容:你说对了。<BR>不需要手工调用,你在声明实例或者new的时候自动调用构造函数,在删除的时候自动调用析构函数。
<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 + -