2

可能重复:
为什么使用“新”会导致内存泄漏?

我对 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

4

3 回答 3

8

第一个问题:在方法 A 中,是否产生了内存泄漏?

是的。

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

是的,但这是一个愚蠢的解决方案。并且在DD_DungeonRoom的复制构造函数或vector::push_back抛出异常的情况下不安全。

第三个问题:是否有(或更可能是“什么是”)将自定义类对象(例如需要通过“new”或“malloc”动态分配)按值添加到向量的更好方法?

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

mvLayoutArray.push_back(DD_DungeonRoom());

更好的是,如果您的编译器支持该功能(它是 C++11 的新功能),将使用emplace_back它完全绕过任何副本,并直接在向量中构造您的对象。只需将与构造函数相同的参数传递给它。在我们的例子中,没有:

myLayoutArray.emplace_back();
于 2013-01-09T18:23:51.450 回答
2

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

DD_DungeonRoom tempRoom;
mvLayoutArray.push_back(tempRoom);

如果您希望析构函数之后立即运行,您可以选择在它周围做一个块以使局部变量超出范围。

此外,如果您对某些东西是否会泄漏内存感到好奇,有很多很好的工具可以实际尝试一下,看看会发生什么。valgrind是一个超级好用的例子。

于 2013-01-09T18:27:24.670 回答
1

如果您对 aproch A 的唯一问题是内存泄漏,为什么不使用 shared_ptr 向量呢?

于 2013-01-09T18:38:12.753 回答