构造函数产生的错误
构造函数产生的异常
当构造函数由于产生异常而没有执行完,回调用析构函数不?
class SymbolTable
{
//...
private:
HTable _htab;
StringBuffer _strbuf;
};
HTable::HTable(int size):_size(size)
{
_alist=new List <int> [size];
}
如果哈希表的构造函数失败,就不会调用它的析构函数,就会产生内存泄露
如果使用整个SymbolTable对象分配,就不会有此问题
如果在一个构造函数中需要分配多个资源,必须创建子对象来拥有这些资源,作为嵌入对象,即使构造函数在完成前失败,它们也能自动销毁
------解决方案--------------------
_alist ?
用auto_ptr试试看
------解决方案--------------------
1.
HTable::HTable(int size):_size(size) {
_alist = new List <int> [size];
}
new 这里是安全的. 基本上它做两部分工作. 分配足够大小的 raw 内存. 采用 list <int> 的默认构造器和拷贝构造器在这块内存上初始化.
假设, raw 内存分配完成, 而list <int> 构造器失败, 将会回收已经分配的 raw 内存. 不会造成泄露.
2. 但是, 如果这样:
HTable::HTable(int size):_size(size) {
_alist = new List <int> [size];
process(); // #2
}
如果#2的函数调用失败, throw 了 exception, 那内存就leak了. 因此, _alist 采用智能指针管理比较好.
------解决方案--------------------
如果有兴趣,去看 <Exceptional C++> <C与C++中的异常处理> 等资料。
牢记一个指导原则:不要在构造函数里抛异常!
遵循推广原则:不要在任何地方抛异常。
写异常安全的代码是太困难了,而且大部分跑异常的地方都是错误不是异常(也根本就不该使用异常)。
------解决方案--------------------
effective c++有一条说 不要让异常逃离构造函数
------解决方案--------------------
构造函数产生异常,该类的析构函数不会调用.但是在异常前生成的在堆栈上创建的对象会调用他们自己的析构函数析构.但是如果是在堆上分配的,就会资源泄露.
------解决方案--------------------
记住:不要在构造函数里头new.
解决办法:
1,使用成员函数列表:
HTable:HTable(int n):size(n),_alist(new List <int> [size])
{}
2,使用shared_ptr或者aotu_ptr,一般不要使用auto_ptr,而使用shared_ptr
3,写一个init()方法在单独处理new
HTable:HTable(int n):size(n){}
bool Init()
{
_alist=new List <int> [size];
}
------解决方案--------------------
使用成员函数列表-> 使用成员初始化列表
------解决方案--------------------
牢记一个指导原则:不要在构造函数里抛异常!
=====================
up之,呵呵^_^,okokok
------解决方案--------------------
auto_ptr 在这里不适用,因为分配的是数组。建议用 vector <list <int> > 代替
------解决方案--------------------
无需那么复杂,你可以这样:
class A{
type *ptr;
...
init(){ptr = new type;...}
public:
A():ptr(0){init();};
~A(){if(ptr)delete ptr;}
};
相类似处理,无论构造成功与否,都不会造成内存泄露。
------解决方案--------------------
为什么不能在构造函数里面用new呢?
------解决方案--------------------
2 ls
不是不能 new, 他们在说那种方案最优. 是要把 异常 考虑进去.
------解决方案--------------------
> > 牢记一个指导原则:不要在构造函数里抛异常!
这个指导原则仅在整个项目不使用异常时有效。
------解决方案--------------------
换言之,当任何地方都不要抛出异常的时候,构造函数不要抛出异常。
C++ 异常的使用是需要一定技巧的。构造函数需要达到异常的强保证,析构函数需要达到无异常保证。具体参考 http://blog.****.net/wingfiring/archive/2006/04/12/660900.aspx
当构造函数由于产生异常而没有执行完,回调用析构函数不?
class SymbolTable
{
//...
private:
HTable _htab;
StringBuffer _strbuf;
};
HTable::HTable(int size):_size(size)
{
_alist=new List <int> [size];
}
如果哈希表的构造函数失败,就不会调用它的析构函数,就会产生内存泄露
如果使用整个SymbolTable对象分配,就不会有此问题
如果在一个构造函数中需要分配多个资源,必须创建子对象来拥有这些资源,作为嵌入对象,即使构造函数在完成前失败,它们也能自动销毁
------解决方案--------------------
_alist ?
用auto_ptr试试看
------解决方案--------------------
1.
HTable::HTable(int size):_size(size) {
_alist = new List <int> [size];
}
new 这里是安全的. 基本上它做两部分工作. 分配足够大小的 raw 内存. 采用 list <int> 的默认构造器和拷贝构造器在这块内存上初始化.
假设, raw 内存分配完成, 而list <int> 构造器失败, 将会回收已经分配的 raw 内存. 不会造成泄露.
2. 但是, 如果这样:
HTable::HTable(int size):_size(size) {
_alist = new List <int> [size];
process(); // #2
}
如果#2的函数调用失败, throw 了 exception, 那内存就leak了. 因此, _alist 采用智能指针管理比较好.
------解决方案--------------------
如果有兴趣,去看 <Exceptional C++> <C与C++中的异常处理> 等资料。
牢记一个指导原则:不要在构造函数里抛异常!
遵循推广原则:不要在任何地方抛异常。
写异常安全的代码是太困难了,而且大部分跑异常的地方都是错误不是异常(也根本就不该使用异常)。
------解决方案--------------------
effective c++有一条说 不要让异常逃离构造函数
------解决方案--------------------
构造函数产生异常,该类的析构函数不会调用.但是在异常前生成的在堆栈上创建的对象会调用他们自己的析构函数析构.但是如果是在堆上分配的,就会资源泄露.
------解决方案--------------------
记住:不要在构造函数里头new.
解决办法:
1,使用成员函数列表:
HTable:HTable(int n):size(n),_alist(new List <int> [size])
{}
2,使用shared_ptr或者aotu_ptr,一般不要使用auto_ptr,而使用shared_ptr
3,写一个init()方法在单独处理new
HTable:HTable(int n):size(n){}
bool Init()
{
_alist=new List <int> [size];
}
------解决方案--------------------
使用成员函数列表-> 使用成员初始化列表
------解决方案--------------------
牢记一个指导原则:不要在构造函数里抛异常!
=====================
up之,呵呵^_^,okokok
------解决方案--------------------
auto_ptr 在这里不适用,因为分配的是数组。建议用 vector <list <int> > 代替
------解决方案--------------------
无需那么复杂,你可以这样:
class A{
type *ptr;
...
init(){ptr = new type;...}
public:
A():ptr(0){init();};
~A(){if(ptr)delete ptr;}
};
相类似处理,无论构造成功与否,都不会造成内存泄露。
------解决方案--------------------
为什么不能在构造函数里面用new呢?
------解决方案--------------------
2 ls
不是不能 new, 他们在说那种方案最优. 是要把 异常 考虑进去.
------解决方案--------------------
> > 牢记一个指导原则:不要在构造函数里抛异常!
这个指导原则仅在整个项目不使用异常时有效。
------解决方案--------------------
换言之,当任何地方都不要抛出异常的时候,构造函数不要抛出异常。
C++ 异常的使用是需要一定技巧的。构造函数需要达到异常的强保证,析构函数需要达到无异常保证。具体参考 http://blog.****.net/wingfiring/archive/2006/04/12/660900.aspx