一个关于释放对象的问题

zhangning111 2006-06-21 07:10:29
在bcb6.0中
1.
我用treeview控件,用到了treenode的data属性,有如下类似的操作
treenode->data = new int[10];
然后将treenode其释放掉
treenode->free();

会不会引起内存泄漏

2.
我用到一个结构
struct S{
int *pInt;
...
}*pS;
pS = new S;
pS->pInt = new int[10];
delete(pS);

会不会引起内存泄漏

3.
用到一个类
我用到一个结构
class TS{
int *pInt;
...
};
pS = new TS;
pS->pInt = new int[10];
delete(pS);

会不会引起内存泄漏
...全文
210 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
BlueDeepOcean 2006-06-22
  • 打赏
  • 举报
回复
C++Builder自带的CodeGuard,帮助也有。
xiaoshi0 2006-06-22
  • 打赏
  • 举报
回复
这个……

BCB自带有内存泄漏检测的工具
zhangning111 2006-06-22
  • 打赏
  • 举报
回复
多谢各位,很快就给分,再问一下
用什么方法或软件可以检测是否有内存泄漏,
daydayup234 2006-06-22
  • 打赏
  • 举报
回复
都会,我以为
xiaoshi0 2006-06-22
  • 打赏
  • 举报
回复
第一个问题我不好回答你,我个人的感觉是不会出现问题。我不知道TTreeView控件是不是自释放的,也不清楚是调用什么函数来进行释放的。但是如果是调用运行时库函数free来进行释放的话,我想应该不会出问题。

第二个会出现问题,因为你那个结构里的成员是一个指针,不包括指针指向的内存,所以在释放时只会释放指针,而没有释放指针指向的内存

第三个问题要看那个类是怎么实现的,如果是自释放的,应该没有问题。

注:自释放的意思就是在析构函数中显示调用delete释放对象指针,调用free函数释放void*指针。
sydt 2006-06-22
  • 打赏
  • 举报
回复
程序退出时 CodeGuard 未报错误,list何时释放的呢?接上!
sydt 2006-06-22
  • 打赏
  • 举报
回复
借楼主宝地问一下?
void __fastcall TForm1::btn2Click(TObject *Sender)
{
TStringList *list = new TStringList();
list->Add("sss1");
list->Add("sss1");
// delete list; //??? CodeGuard 未报错误,list何时释放的呢?
char *buf = new char[100];
strcpy(buf, "ssssss");
list->Add(buf);
delete []buf;
}
list何时释放的呢?
勉励前行 2006-06-22
  • 打赏
  • 举报
回复
都会;
1 TreeNode->Data 是个 void * , Node 析构时不处理TreeNode->Data
2 与 3 是一样的道理. 类与结构在析构时会调用析构函数,默认的析构函数是不会处理指针对象的.除非你显式地声明一个析构函数并在其中处理指针对象.


zyyoung 2006-06-22
  • 打赏
  • 举报
回复
学习
xiaoshi0 2006-06-22
  • 打赏
  • 举报
回复
楼上的第一点说的有理,那个data是什么类型的呢?如果是void*的,我认为有可能释放,有可能不释放,这要看帮助,看TTreeNode是怎么实现的,如果要是其他类型的,那就应该是不释放的了。

第三点还是取决于你的类的实现方式,不能确定一定会泄漏。
Maconel 2006-06-22
  • 打赏
  • 举报
回复
1、会,treenode又不知道你往data里放的什么东西,也许是个int变量呢,应该不会自动给你释放;
2、会。
3、会。类和结构除了默认访问权限,其他没有什么不同。
CACACACACA 2006-06-21
  • 打赏
  • 举报
回复
都有问题
easyblue 2006-06-21
  • 打赏
  • 举报
回复
1.会。
TreeNode的Data类型为void*, 必须显式编写相应的内存释放语句。
可以使用TreeView的OnDeletion事件,来释放Node->Data的内存。

2.会
delete(ps)释放的是new S所申请的内存,不包括new int[10].

3.会
除非类此如下
TS::TS(..)
{
....
pInt=NULL;
}
TS::~TS(...)
{
if (NULL!=pInt){
delete pInt;
}
}

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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