在try{}里new 出来的变量,如果不delete的话,会内存泄露马?解决方法
在try{}里new 出来的变量,如果不delete的话,会内存泄露马?
如下
try
{
Sap_var sap = new Sap;
//此处的sap需要delete吗?
}
catch(...)
{
printf( "test ");
}
------解决方案--------------------
需要,不然内存泄漏
------解决方案--------------------
new和delete必须匹配
------解决方案--------------------
那在里new出来的都需要delete
------解决方案--------------------
似乎是动态内存分配里面遇到了异常都会不释放资源,造成所谓的内存泄露。
总之如果构造函数没有得到正常的完成的话,其析构函数也将得不到调用,并且后面的一系列的对象也将不能继续构造函数。
这里有一个例子,演示了当构造函数没有正常结束时不会调用相关联的析构函数。这个例子还显示了当在创建对象数组的过程中抛出异常时会发生什么情况:
#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
如下
try
{
Sap_var sap = new Sap;
//此处的sap需要delete吗?
}
catch(...)
{
printf( "test ");
}
------解决方案--------------------
需要,不然内存泄漏
------解决方案--------------------
new和delete必须匹配
------解决方案--------------------
那在里new出来的都需要delete
------解决方案--------------------
似乎是动态内存分配里面遇到了异常都会不释放资源,造成所谓的内存泄露。
总之如果构造函数没有得到正常的完成的话,其析构函数也将得不到调用,并且后面的一系列的对象也将不能继续构造函数。
这里有一个例子,演示了当构造函数没有正常结束时不会调用相关联的析构函数。这个例子还显示了当在创建对象数组的过程中抛出异常时会发生什么情况:
#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