在我的应用我创建并返回充满了动态分配的对象从派生类像这样的数组:删除动态创建的对象
void someGetter(std:vector<DerivedClass> & returnV)
{
BaseClass* base = object->clone(); // "object" is a "unique_ptr<BaseClass>"
DerivedClass* derived = dynamic_cast<DerivedClass*> (base);
if (derived != nullptr)
{
returnV.push_back(*derived);
}
else
{
delete base;
}
}
这显然造成内存泄漏(valgrinds帮助我在这里),因为派生永远不会被删除。
我试图释放所分配的内存是这样的:
delete &returnV[0];
它不给任何编译错误/警告和代码仍然运行正常。但valgrind会在该行代码中报告一些额外的错误(无效读取,无效的自由),并且泄漏仍然存在。
有没有什么方法可以释放像这样返回的内存?或者我应该返回unique_ptr而不是对象?
东西(以及作为地下室里的人)尖叫“可怕的虐待”......如果你有'EvenMoreDerivedClass'呢?这将在副本中瓜分... –
对于C++ 11的问题:你真的应该使用'的std :: unique_ptr'(或'的std :: shared_ptr',根据您的使用情况)。手动内存管理实际上不被推荐,因为内存泄漏的潜力(由于缺少像代码中的delete一样,或者由于不处理引发异常的情况)非常高。所以我的建议永远不会(通常有一些例外,尽管不是很多)使用手动管理,并始终使用智能指针(或诸如boost指针容器之类的东西)。 – Grizzly
@Grizzly与Kerrek的第二个答案我不这样做手工的内存管理了 – Minion91