在try{}里new 出来的变量,如果不delete的话,会内存泄露马?

darkone 2007-05-22 03:27:32
如下

try
{
Sap_var sap = new Sap;
//此处的sap需要delete吗?
}

catch(...)
{
printf("test");
}
...全文
298 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
yoyo_alex_lw 2007-05-22
  • 打赏
  • 举报
回复
每一个new就要对应一个delete
taodm 2007-05-22
  • 打赏
  • 举报
回复
变量作用域问题。
try{}外面怎么可能看到try{}里面定义的局部变量嘛。
darkone 2007-05-22
  • 打赏
  • 举报
回复
但为什么在try{}外面delete sap会失败?
taodm 2007-05-22
  • 打赏
  • 举报
回复
每一个new就要对应一个delete
jianshi051 2007-05-22
  • 打赏
  • 举报
回复
似乎是动态内存分配里面遇到了异常都会不释放资源,造成所谓的内存泄露。

总之如果构造函数没有得到正常的完成的话,其析构函数也将得不到调用,并且后面的一系列的对象也将不能继续构造函数。

这里有一个例子,演示了当构造函数没有正常结束时不会调用相关联的析构函数。这个例子还显示了当在创建对象数组的过程中抛出异常时会发生什么情况:


#include<iostream>

using namespace std;

class Trace
{
static int counter;
int objid;
public:
Trace()
{
objid = counter ++;
cout<<"Constructing # "<<objid<<endl;
if(objid==3)
throw 3;
}
~Trace()
{
cout<<"Destructing # "<<objid<<endl;
}
};

int Trace::counter = 0;

int main()
{
try
{
Trace n1; //没有异常,完成构造
Trace array[5]; //第0,1号元素得到完全构造,但是之后的元素由于第2号元素构造失败,所以退出构造,第3,4号元素没有构造和析构。
Trace n2; //和上一句一样,由于抛出了异常,所以得不到构造,更加得不到析构。
}
catch(int i)
{
cout<<"caught "<<i<<endl;
}
return 0;
}


程序的输出结果为:

Constructing # 0
Constructing # 1
Constructing # 2
Constructing # 3
Destructing # 2
Destructing # 1
Destructing # 0
caught 3

或者可以用auto_ptr:
auto_ptr类模板是在头文件<memory>中定义的,它的构造函数接受一个指向类型属性的指针作为参数,它是一个用于封装指向分配的堆内存的指针。
  • 打赏
  • 举报
回复
那在里new出来的都需要delete
WizardK 2007-05-22
  • 打赏
  • 举报
回复
new和delete必须匹配
mx19841031 2007-05-22
  • 打赏
  • 举报
回复
需要,不然内存泄漏

64,681

社区成员

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

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