gpt4 book ai didi

c++ - 谁负责删除?

转载 作者:太空狗 更新时间:2023-10-29 19:42:09 25 4
gpt4 key购买 nike

我正在分析一段代码,但我对一段特定的代码感到困惑。我已经发布了传达相同含义的代码/伪代码。

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
}

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?
}

问题 - 第 2 部分

感谢您对第一个问题的见解。现在这是正在发生的真正问题。

Class 1 是一个 C++ 进程,Class 2 是一个与 Informix 数据库对话的库。Class2::get_records_from_db() 是一个查询 Informix 数据库并返回结果集的函数。我增强了上面的代码,它更类似于真实代码。

Collection 对象处理 200k 的 row 对象,正如你们大多数人所说的那样没有正确释放。
调用者在通用 catch block 中看到“未知异常”。这可能是因为 Class 2 中产生的巨大内存泄漏吗?

我还在日志中看到一些 Informix 错误 406(内存不足错误)。吐出一系列 Unknown ExceptionSQLERR406

后进程核心转储

我想知道核心转储是否是内存泄漏的副产品。

最佳答案

What is the problem with the code you presented?

您提供的代码示例是非常糟糕和错误的代码。

没有人删除 (rowclt) 它们中的任何一个。这会导致内存泄漏未定义的行为,具体取决于它们的析构函数是否具有平凡的或非平凡的实现。要么这意味着可能会发生非常糟糕的事情。

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

Who should be responsible for delete?

对象本身!
这些对象应该有一个内置的功能,可以在它们的范围({,})结束时立即取消分配它们自己。这样一来,没有人需要显式释放任何对象,但一旦不再需要它们,它们就会被隐式删除。这种技术通常被称为 Resource Allocation is Initialization(RAII) or Scope Bound Resource Management(SBRM) 在 C++ 中。

您的每个对象(rowclt)都应该使用 RAII 通过在这些原始指针上编写包装器,或者甚至更好地简单地使用现成的 Smart pointers .

关于c++ - 谁负责删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11119746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com