cpp*_*der 3 c++ dynamic delete-operator
我正在分析代码,我对特定代码感到困惑.我发布了代码/伪代码,它们将传达相同的含义.
1级
Class1::Func1()
{
Collection* cltn;
try
{
cltn = Class2::get_records_from_db();
}
catch(Informix error)
{}
catch(DB Error)
{}
catch(...)
{ Unknown exception } //I get this error always once the process processes lot of records
}
Run Code Online (Sandbox Code Playgroud)
2级
Collection* Class2::get_records_from_db()
{
Collection *clt = new Collection();
try
{
//Query database
For each row in query result
Row *row = new row();
populate(row)
clt->add(*row)
...
if( Informix error)
{
throw Informix error;
}
}
catch(...)
{
delete clt; //Who will delete row?
clt = 0;
throw Db error
}
return clt; //Who will delete clt?
}
Run Code Online (Sandbox Code Playgroud)
问题 - 第2部分
感谢您对第一个问题的见解.现在这是正在发生的真正问题.
Class 1
是一个C++进程,Class 2
是一个与Informix数据库对话的库.
Class2::get_records_from_db()
是一个查询Informix DB并返回结果集的函数.我已经增强了上面的代码,它更类似于真正的代码.
Collection
对象处理200k个row
对象,正如大多数人所说的那样,它们没有被正确释放.
调用者在常规catch块中看到"Unknown exception".可能是因为创造了巨大的内存泄漏Class 2
?
我还在406 (Out of memory error)
日志中看到一些Informix错误.吐出一系列Unknown Exception
&后,进程核心转储SQLERR406
我想知道核心转储是否是内存泄漏的副产品.
Alo*_*ave 12
您提供的代码有什么问题?
您提供的代码示例是一个非常错误和错误的代码.
没有人删除(row
和clt
)他们中的任何一个.这导致内存泄漏或未定义行为,这取决于它们的析构函数是否具有琐碎或非平凡的实现.无论哪种方式,它都意味着可能发生非常糟糕的事情.
如果使用分配对象new
,则需要通过调用delete
返回的指针显式释放它new
.由于您没有调用delete
任何一个指针,因此它们都不会被释放.
谁应该负责删除?
对象本身!
对象应具有内置功能,以便在其范围({
,}
)结束时自行解除分配.这样,没有人需要显式释放任何对象,但是一旦不再需要它们就会被隐式删除.这种技术通常被称为C++中的资源分配是初始化(RAII)或范围界限资源管理(SBRM).
每个对象(row
和clt
)都应该通过在这些原始指针上写入包装器来使用RAII,甚至可以通过使用现成的智能指针更好地使用RAII.
归档时间: |
|
查看次数: |
549 次 |
最近记录: |