C++ 按值填充std::vector时,是否会删除动态分配的对象指针?

C++ 按值填充std::vector时,是否会删除动态分配的对象指针?,c++,pointers,memory-leaks,vector,dynamic-allocation,C++,Pointers,Memory Leaks,Vector,Dynamic Allocation,可能重复: 我对STL还比较陌生,我读到过这样一篇文章:通常保存对象的向量,而不是指向对象的指针的向量,这是一个很好的实践。为了遵守这一信条,我遇到了以下情况: //Approach A //dynamically allocates mem for DD_DungeonRoom object, returns a pointer to the block. //then, presumably, copy-constructs the de-referenced DD_DungeonRoom

可能重复:

我对STL还比较陌生,我读到过这样一篇文章:通常保存对象的向量,而不是指向对象的指针的向量,这是一个很好的实践。为了遵守这一信条,我遇到了以下情况:

//Approach A
//dynamically allocates mem for DD_DungeonRoom object, returns a pointer to the block.
//then, presumably, copy-constructs the de-referenced DD_DungeonRoom as a 
//disparate DD_DungeonRoom object to be stored at the tail of the vector
//Probably causes memory leak due to the dynamically allocated mem block not being
//caught and explicitly deleted
mvLayoutArray.push_back(*(new DD_DungeonRoom()));

//Approach B
//same as A, but implemented in such a way that the dynamically allocated mem block
//tempRoom can be deleted after it is de-referenced and a disparate DD_DungeonRoom is
//copy-constructed into the vector
//obviously rather wasteful but should produce the vector of object values we want
DD_DungeonRoom* tempRoom = new DD_DungeonRoom();
mvLayoutArray.push_back(*(tempRoom));
delete tempRoom;
第一个问题:在方法A中,是否创建了内存泄漏?
第二个问题:假设A产生内存泄漏,B解决了吗? 第三个问题:有没有更好的方法(或者更可能的方法是“什么”)将自定义类对象(例如,需要通过“new”或“malloc”进行动态分配)添加到按值向量中

谢谢, CCJ

第一个问题:在方法A中,是否创建了内存泄漏

第二个问题:假设A产生内存泄漏,B解决了吗

是的,但这是一个愚蠢的解决方案。如果
DD_DungeonRoom
的复制构造函数或
vector::push_back
引发异常,则不安全

第三个问题:有没有(或者更可能是“什么是”)更好的解决方法 添加自定义类对象(例如,需要通过“新建”进行动态分配) 或“malloc”)到向量的值

<>没有C++中的对象需要动态内存分配。只需将对象直接添加到调用构造函数的向量,sans
new

mvLayoutArray.push_back(DD_DungeonRoom());
更好的是,如果您的编译器支持该功能(这是C++11的新功能),则可以使用
emplace\u back
,它完全绕过任何副本,直接在向量中构造对象。只需将相同的参数传递给它,就像传递给构造函数一样。在我们的例子中,没有:

myLayoutArray.emplace_back();

方法A导致泄漏,是的。 方法B没有,但由于您所做的只是在堆上分配一个对象,将一个副本放入向量,然后将其删除,因此在这种情况下,您也可以这样做:

DD_DungeonRoom tempRoom;
mvLayoutArray.push_back(tempRoom);
或者,如果希望析构函数随后立即运行,可以围绕它执行一个块,使局部变量超出范围


另外,你很好奇是否有什么东西会泄漏内存,有很多很好的工具可以尝试一下,看看会发生什么。这是一个非常容易使用的例子

如果aproch A的唯一问题是内存泄漏,为什么不使用shared\u ptr向量?

它会泄漏,因为我不知道push\u back()是有效的语法。好吧,这简化了事情,并大大改善了事情@CJ:是的,C++一旦你的头脑里有了java的想法,就变得更简单、更漂亮了。因为它有开销,这对他的情况来说是不必要的。比只把每个都复制到向量然后被破坏的开销更大。这取决于建造DD_地下室的规模或成本。或者?共享的ptr确实增加了一点复杂性,比我目前认为需要的要多;显然,方法B不是一个好的生产解决方案,而是澄清了我的困惑@BenjaminLindley的建议最适合我的情况。现在我不确定,但请检查您是否能从移动副本construcotr或soo中受益。