提供以下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] 删除。
我来说两句