在我的应用程序中,我正在创建并返回一个数组,其中填充了来自派生类的动态分配的对象,如下所示:
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 在这里帮助我),因为 derived 永远不会被删除。
我试过像这样释放分配的内存:
delete &returnV[0];
它没有给出任何编译错误/警告,代码仍然运行良好。但是 valgrind 在该行代码上报告了一些额外的错误(无效读取、无效释放)并且泄漏仍然存在。
有什么方法可以释放这样返回的内存吗?或者我应该返回 unique_ptr 而不是对象?
最佳答案
如果您要创建一个包含值 类型Derived
的 vector ,那么代码是正确的,除了内存泄漏。请注意,您需要释放的对象不是容器中的对象(它是一个拷贝),而是您克隆的对象:
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);
}
delete base;
}
此外,如果 clone()
按照它说的去做(即克隆对象),那么您可以通过首先使用 dynamic_cast
测试 base
对象是 DerivedClass
。如果是,则将拷贝插入容器并避免克隆。
关于c++ - 删除动态创建的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12601786/