C++ 我是否应该清除c+中析构函数中唯一的_ptr向量+;11即使valgrind没有';不显示内存泄漏

C++ 我是否应该清除c+中析构函数中唯一的_ptr向量+;11即使valgrind没有';不显示内存泄漏,c++,c++11,memory-leaks,valgrind,smart-pointers,C++,C++11,Memory Leaks,Valgrind,Smart Pointers,将持有者分类如下: class Holder { string name; std::vector<std::unique_ptr<Object>> objects; public: Holder(string name): name(name){ } ~Holder(){}; Holder & operator=(const 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));
    }


    };

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

您不必手动调用
清除
std::vector
的析构函数将自动调用
std::unique_ptr
的析构函数


与内置指针相比,智能指针的主要优点是不需要手动清理。

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

我觉得奇怪的是,对于您的情况,最简单的解决方案可能是使用

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

你的意思是在“添加”功能中我应该使用“后置”而不是“后置”吗?还是在测试功能中?在测试函数内部,我想调用add来测试add函数。对象的参数多于名称。我能安置后面的物体吗?像这样的空持有者::add(Object Object){this->objects.emplace_back(Object);}@Govan不,你不能,因为这不是工作方式。事实上,
emplace\u back
安置了一个新元素<代码>向后推,而是复制/移动现有代码。DarioOO展示了如何在您的案例中使用它。我为您的函数添加了一个可能的实现。。。参见编辑(#2);)如果我们保持OP的当前设计(
vector
),那么
重新部署
是错误的选择。为什么动态分配您的
持有者
,如果您意外地离开该功能,它就有泄漏的风险?也就是说,您的问题归结为
向量的析构函数是否会释放它引用的内容。为此,考虑<代码> CULL()/<代码>的调用,这几乎是相同的。总而言之,析构函数是C++的重要组成部分,允许您自动化资源管理,您可以依赖这个。@ UlrichEckhardt My Holder是动态分配的,因为当我有一个UpQuyJ-PTR向量时,我不能使用赋值操作符。编写此代码持有者=持有者(“袋子”);导致问题,因为unique_ptr没有复制构造函数。因此,我删除了holder-holder中的赋值运算符&运算符=(const-holder&holder)=delete;还有别的办法吗?我知道我也可以把我的支架放在独特的ptr中。但我想问的是,是否有一种方法可以通过价值创造持有者。正确的方法是写
持有者(“bag”),就这么简单。如果你知道你可以把它放进一个
独特的\u ptr
,你为什么不呢?因此,做这些事情是C++编程的重要组成部分。谢谢你,UlrichEckhardt。当你从java世界到C++世界时,你总是会被语法混淆。C++ 11的一个好的经验法则是,如果你写了一个析构函数或拷贝/移动运算符,你可能做了一些错误的事情。谷歌称之为“C++零规则”。
~Holder(){
  this->objects.clear();
};
std::vector< Object> objects;
objects.emplace_back("test");
#include <utility>  // std::forward
#include <vector>

//...

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