我应该在c ++ 11中的析构函数中清除unique_ptr的向量,即使valgrind不显示内存泄漏

戈万

提供以下Holder课程:

    class Holder {
        string  name;
        std::vector<std::unique_ptr<Object>> objects;
    public:
        Holder(string name): name(name){
        }   

        ~Holder(){};
        Holder & operator=(const Holder & holder) = delete;  

    vector<unique_ptr<Object>> const& Holder::getContent()const{
        return this->objects;
    }

    void Holder::add(unique_ptr<Object> objPtr){
       this->objects.push_back(move(objPtr));
    }


    };

如果我在以下方法中调用Holder对象:

void HolderTest::addObject(){
    Holder *holder = new Holder("bag");
    holder->add(unique_ptr<Object>(new Object("test")));
    vector<unique_ptr<Object>> const& objects = holder->getContent();
    const std::string name = objects[0].get()->name();
    CPPUNIT_ASSERT_EQUAL((string)"test", name);
    delete holder;
}

我的问题是:我应该在Holder析构函数中调用我的unique_ptr的clear方法的向量,以避免如下所示的内存泄漏吗?

~Holder(){
  this->objects.clear();
};

我的另一个问题是我仍然可以使用“ Valgrind Tools Integration”版本3.0.0.201502180018来查找c ++ 11应用程序中的内存泄漏,还是无法在c ++ 11程序中找到内存泄漏?

咖啡开发者

从技术上讲,您没有任何内存泄漏。删除Holder时,中的所有元素都会vector被破坏(因为Holder的析构函数已经清除了向量),并且unique_ptr的析构函数实际上释放了分配给添加对象的内存。

在我看来,很奇怪的是,对于您的情况,最简单的解决方案是使用

std::vector< Object> objects;
objects.emplace_back("test");

wich更加有效且易于阅读。

编辑:问题的第二部分,Valgrind可能有假阳性(当您没有泄漏时警告泄漏),但我从未听说过Valgrind报告有假阴性(当您有泄漏时根本没有泄漏)。

编辑2:

#include <utility>  // std::forward
#include <vector>

//...

template< typename... Args>
void Holder::add( Args&&... args){
   objects.emplace_back( std::forward< Args>(args)...);
}

用法:

holder.add("Test");

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我应该在C ++中删除静态对象吗

我应该在C#dllimport本机方法调用中为参数释放内存吗?

我是否应该在C99中跨翻译单元故意内联函数

我应该在类的析构函数中删除QPointer吗?

我应该在析构函数中写入文件末尾吗?

我应该在析构函数中重置原始成员变量吗?

我应该在类的析构函数中写什么

我应该在 C 中创建一个全局缓冲区吗

我应该在C中的basename / dirname之后释放strdup指针吗?

如何决定我应该在C#中抛出ArgumentException还是ArgumentNullException

我应该在C ++中手动写出“子结果”吗?

我可以/应该在C#中替换此GOTO语句吗

我应该在C#中通过属性设置器分配类字段吗?

我应该在哪里将代码放在C#服务中

我应该在C#中显式地将`GetObjectData`方法虚拟化吗?

我是否应该在基于C ++ 11范围的QHash :: keys()上使用qAsConst

我应该在C ++中使用std :: function还是函数指针?

我应该在 c 中使用哪些 i/o 函数

我应该在构造函数中引发异常吗

我应该在构造函数中构建对象吗?

我应该在构造函数中验证参数吗?

我应该在哪个函数中传递WaitGroup?

我应该在virtualenv中pip install python吗?

我应该在备份中包含/ dev吗?

我应该在 React 中的哪里保存 API 信息?

我应该在virtualenv中安装python 3吗?

我什么时候应该在StratifiedKFold中洗牌

我应该在Django模型中测试方法吗?

我应该在模型中抛出HttpStatus异常吗?