据我所知,动态内存分配可用于控制对象的生命周期。当我“新”一个对象时,它会在堆中保留在内存中,直到我删除它为止。
现在,有时情况并非那么简单。情况就是这种情况,我希望保留一定的内存块,直到我释放它,防止破坏该内存块中的数据。例如,我想将指向堆栈上分配的对象的指针插入到向量中。只要指向对象的指针位于该向量中,指针指向的对象就不会被销毁。这是出于安全原因。如何实现这一点,使用动态内存分配保留一块内存?
答案 0 :(得分:6)
最简单的方法就是使用smart pointers
您可以使用:
“智能指针是存储动态指针的对象 已分配(堆)对象。它们的行为与内置的C ++指针非常相似 除了他们自动删除指向的对象 适当的时候。智能指针在脸上特别有用 例外,因为它们确保动态地适当销毁 分配的对象。它们还可用于动态跟踪 分配的对象由多个所有者共享。
从概念上讲,智能指针被视为拥有指向的对象, 因此在不再存在时负责删除对象 需要“。
std :: unique_ptr是一个智能指针,保留了一个人的唯一所有权 对象通过指针并在unique_ptr时销毁该对象 超出范围。没有两个unique_ptr实例可以管理相同的内容 对象
std :: shared_ptr是一个保留共享所有权的智能指针 通过指针对象。几个shared_ptr对象可能拥有相同的内容 对象
答案 1 :(得分:3)
您接近解决方案。标准说明了自动/动态内存管理,它通常是堆栈/堆分配的直接转换。
如果要创建一个生命周期超出创建范围的对象,则必须使用new
,但不一定要直接使用。
在您的情况下,在我看来,一个简单的解决方案是拥有std::vector<MyObject>
,然后直接在vector
中创建对象。在下面,它可能正在使用new
,但您不必担心它:封装岩石。
答案 2 :(得分:0)
你不能在堆栈和上分配一个对象,确保一旦程序流离开当前的函数/方法并继续运行它就不会被覆盖。
如果你想要一个对象被释放当且仅当对它的引用为零时,你仍然必须在堆上分配它并使用智能指针或垃圾收集器。