1

From what I've understood, dynamic memory allocation can be used to control lifetime of an object. When I "new" an object, it stays in memory, on the heap, until I delete it.

Now, sometimes things aren't that simple. This is the case in a scenario, in which I'd like to keep certain block of memory reserved, until I free it, preventing destruction of the data in that memory block. For example, I'd like to insert a pointer to an object allocated on the stack into a vector. Whenever a pointer to an object is in that vector, the object the pointer points to cannot be destroyed. This is for safety reasons. How can one accomplish this, reserve a block of memory using dynamic memory allocation?

4

3 回答 3

6

做你想做的最简单的方法是使用智能指针

您可以使用:

“智能指针是存储指向动态分配(堆)对象的指针的对象。它们的行为很像内置的 C++ 指针,只是它们会在适当的时间自动删除指向的对象。智能指针在面对异常时特别有用,因为它们确保正确销毁动态分配的对象。它们还可用于跟踪由多个所有者共享的动态分配的对象。

从概念上讲,智能指针被视为拥有指向的对象,因此在不再需要对象时负责将其删除。”

std::unique_ptr 是一个智能指针,它通过指针保留对象的唯一所有权,并在 unique_ptr 超出范围时销毁该对象。没有两个 unique_ptr 实例可以管理同一个对象。

std::shared_ptr 是一个智能指针,它通过指针保留对象的共享所有权。几个 shared_ptr 对象可能拥有同一个对象。

于 2013-04-30T06:36:02.420 回答
3

您已接近解决方案。该标准谈到自动/动态内存管理,这通常是堆栈/堆分配的直接转换。

如果您想创建一个生命周期超过创建它的范围的对象,那么您必须使用new,但不一定直接使用。

在您的情况下,在我看来,一个简单的解决方案是拥有一个std::vector<MyObject>然后直接在vector. 在下面,它可能正在使用new但你不必担心它:封装岩石。

于 2013-04-30T06:45:47.913 回答
0

您不能在堆栈上分配对象,确保一旦程序流离开当前函数/方法并继续前进,它就不会被覆盖。

如果您希望当且仅当对它的引用为零时才释放对象,那么您仍然必须在堆上分配它并使用智能指针或垃圾收集器。

于 2013-04-30T06:40:16.493 回答