结构体的释放问题~~~不是很清楚~~:)

kikikind 2006-04-03 04:49:14
我的一个程序里有如下结构体:

class TreeNode
{
int data;
char * word;
TreeNode * lchild;
TreeNode * rchild;
};

之后有操作:
TreeNode * Node = new TreeNode;
Node->word = new char[10];

现在释放:
delete Node; //出错!!

改成如下形式:
delete [] Node->word; //这句正常
delete Node; //这句还是出错

后来只好改成这样了:
delete [] Node->word;
Node->word = NULL;
delete Node; //顺利通过

----------------------------------------
我想问问大家有没更好的方法释放呢?还是一定要这样做~~~~Node->word = NULL;这句觉得有点怪哈~~
...全文
417 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
kikikind 2006-04-06
  • 打赏
  • 举报
回复
谢谢各位解答~~~在搞课程设计了~~差少忙了给分哈`~~:)
逸学堂 2006-04-04
  • 打赏
  • 举报
回复
这样修改一下
class TreeNode
{
TreeNode():word(null){}// 构造时,word制定为null
~TreeNode() // 在喜购函数中,删除。
{
if(word != null)
{
delete [] word; // delete word; 这里这两种形式都会没有问题,不过还是推荐用[]形式
}
}
int data;
char * word;
TreeNode * lchild;
TreeNode * rchild;
};

这样就可以
TreeNode * Node = new TreeNode;
Node->word = new char[10];

delete Node;
du51 2006-04-04
  • 打赏
  • 举报
回复
既然是类.自己写个成员函数释放吧.不用这样烦.
liyusen007 2006-04-04
  • 打赏
  • 举报
回复
在delete [] Node->word;
Node->word = NULL;
delete Node;这一句调用的时候会调用析构函数,试图释放word,但这时的word已经释放完成,所以必须将word置为NULL,这样delete什么都不作。

但当你没有delete [] Node->word;这一句直接调用
delete node的时候,析构将不能够处理数组型的释放,所以会出错。
xbt746 2006-04-03
  • 打赏
  • 举报
回复
应该第一个是内存泄漏了
动态数组不同的申请有不同释放吧
yiyo2025 2006-04-03
  • 打赏
  • 举报
回复
我用vc6也没有报错

popy007 2006-04-03
  • 打赏
  • 举报
回复
kikikind(可乐)

1)理解

2)我的就不会,你使用了release模式??

3)你的2、3两种释放都不会造成memory leak,因为你释放了所有从heap中申请的内存

kikikind 2006-04-03
  • 打赏
  • 举报
回复
To popy007(Twinsen) ,piaochen_2002(执子之手,与子偕老!),OOPhaisky(渴望成功)
1.是呀,我只是贴了关键的一部分出来,没有考虑是public还是private,因为我的实现的是类的成员函数中呀~~~不好意思!

2.我用的是VC++6呀~~~如果不指定Node->word=NULL;就会报错~~~~

3.怎么才能不会有memory leak呢?
OOPhaisky 2006-04-03
  • 打赏
  • 举报
回复
首先说一个无关的问题:Node->word = new char[10];这一句就应该出错,因为word是private成员。当然了,这与你的问题无关。

现在说你的问题。不知道你用的是哪一种编译器,正常来说,这句是没有语法错误的,应该可以编译成功,但是如楼上2位所说,这种释放方法会导致memory leak。
piaochen_2002 2006-04-03
  • 打赏
  • 举报
回复
TreeNode * Node = new TreeNode;
Node->word = new char[10];
delete []Node->word;
Node->word=NULL;
Node=NULL;
这样释放是没有问题的,也不会友内存泄漏
popy007 2006-04-03
  • 打赏
  • 举报
回复
你用的什么编译器阿?第一个肯定会造成memory leak,报不报错看编译器够不够

健壮,但是我用vc6的cl.exe没有报错。下面这个程序应该没有问题。

#include <iostream>
using namespace std;

class TreeNode {
public:
int data;
char * word;
TreeNode * lchild;
TreeNode * rchild;
};

int main() {
TreeNode * Node = new TreeNode;
Node->word = new char[10];
delete[] Node->word;
delete Node;
return 0;
}

另外,你的class没有public,怎么能够直接访问私有成员Node->word?

是不是代码没有贴全?lchild和rchild有没有分配空间。

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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