谁负责删除?

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

您提供的代码有什么问题?

您提供的代码示例是一个非常错误和错误的代码.

没有人删除(rowclt)他们中的任何一个.这导致内存泄漏未定义行为,这取决于它们的析构函数是否具有琐碎或非平凡的实现.无论哪种方式,它都意味着可能发生非常糟糕的事情.

如果使用分配对象new,则需要通过调用delete返回的指针显式释放它new.由于您没有调用delete任何一个指针,因此它们都不会被释放.

谁应该负责删除?

对象本身!
对象应具有内置功能,以便在其范围({,})结束时自行解除分配.这样,没有人需要显式释放任何对象,但是一旦不再需要它们就会被隐式删除.这种技术通常被称为C++中的资源分配是初始化(RAII)或范围界限资源管理(SBRM).

每个对象(rowclt)都应该通过在这些原始指针上写入包装器来使用RAII,甚至可以通过使用现成的智能指针更好地使用RAII.