c++ - 删除动态创建的对象

标签 c++ memory c++11

在我的应用程序中,我正在创建并返回一个数组,其中填充了来自派生类的动态分配的对象,如下所示:

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/

相关文章:

java - 哪里可以找到如何计算 java 对象大小的证据

c++ - 在 hackerrank 生日蛋糕蜡烛问题中使用 std::vector

c - 如何将 3x3 的卷积核与图像相乘

c++ - 为什么初始化列表顺序必须匹配成员声明顺序?

c++ - 在模板函数中自动将指针/迭代器转换为 const

c++ - 如何检查派生类中对象的类型名称?

c++ - 为什么 VC++ IntelliSense 不刷新错误列表?

ios - 在ipad/iphone app中使用众所周知的免费内存代码是否合法?

c++ - 当函数中未指定返回值时,C++ 程序如何获取返回值?

c++ - 函数调用参数中的构造函数样式转换