C++ 通过动态内存管理防止自动变量销毁

C++ 通过动态内存管理防止自动变量销毁,c++,dynamic,C++,Dynamic,据我所知,动态内存分配可以用来控制对象的生存期。当我新建一个对象时,它会留在内存中,在堆上,直到我删除它 现在,有时候事情并不是那么简单。这是一个场景中的情况,在这个场景中,我希望保留某个内存块,直到释放它,以防止破坏该内存块中的数据。例如,我想在向量中插入一个指向堆栈上分配的对象的指针。每当指向某个对象的指针位于该向量中时,该指针指向的对象就不能被销毁。这是出于安全考虑。如何做到这一点,使用动态内存分配来保留一块内存?最简单的方法就是使用 您可以使用: 智能指针是动态存储指向的指针的对象 已分

据我所知,动态内存分配可以用来控制对象的生存期。当我新建一个对象时,它会留在内存中,在堆上,直到我删除它


现在,有时候事情并不是那么简单。这是一个场景中的情况,在这个场景中,我希望保留某个内存块,直到释放它,以防止破坏该内存块中的数据。例如,我想在向量中插入一个指向堆栈上分配的对象的指针。每当指向某个对象的指针位于该向量中时,该指针指向的对象就不能被销毁。这是出于安全考虑。如何做到这一点,使用动态内存分配来保留一块内存?

最简单的方法就是使用

您可以使用:

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

从概念上讲,智能指针被视为拥有指向的对象, 并负责在对象不再存在时删除该对象 需要

或C++11智能指针,如或 std::unique_ptr是一个智能指针,它保留对 对象,并在唯一\u ptr 超出范围。没有两个唯一的\u ptr实例可以管理同一个 反对

std::shared_ptr是一个智能指针,它保留对 对象通过指针。多个共享的_ptr对象可能拥有相同的 反对


做你想做的事情最简单的方法就是使用

您可以使用:

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

从概念上讲,智能指针被视为拥有指向的对象, 并负责在对象不再存在时删除该对象 需要

或C++11智能指针,如或 std::unique_ptr是一个智能指针,它保留对 对象,并在唯一\u ptr 超出范围。没有两个唯一的\u ptr实例可以管理同一个 反对

std::shared_ptr是一个智能指针,它保留对 对象通过指针。多个共享的_ptr对象可能拥有相同的 反对


您不能在堆栈上分配对象,并确保程序流离开当前函数/方法并继续运行时不会覆盖该对象


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

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


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

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

如果要创建的对象的生存期超过了创建对象的范围,则必须使用new,但不一定直接使用


在您的例子中,我认为一个简单的解决方案是使用std::vector,然后直接在vector中创建对象。下面,它可能使用了新的,但您不必担心它:封装岩石。

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

如果要创建的对象的生存期超过了创建对象的范围,则必须使用new,但不一定直接使用


在您的例子中,我认为一个简单的解决方案是使用std::vector,然后直接在vector中创建对象。下面,它可能使用了新的,但您不必担心它:封装岩石。

C++提供了自己的智能指针:请参阅std::unique\u ptr和std::shared\u ptr。@stefan您发表评论时,我正在添加C++11标准!Tha
不管怎样,使用智能指针不会改变自动对象的生存期,这也是问题的一个方面。正确使用智能指针可以简化生命周期管理,但在生命周期出现问题时插入智能指针并不是一个好的解决方案。虽然我喜欢这个答案,但对我来说,它似乎太通用了。我试着解释为什么我能做到最好。智能指针是我无论如何都会使用的东西,因为它们具有安全性,但我问的问题更多的是,是否可以利用动态内存分配来保持堆栈分配变量的内存分配,从而防止自动隐式销毁它。我知道,我知道,智能指针通常也不会被明确地销毁,但我希望你能明白这一点。我说清楚了吗?0_oC++提供了自己的智能指针:请参阅std::unique_ptr和std::shared_ptr。@stefan在您发表评论时,我正在添加c++11标准!无论如何,谢谢。使用智能指针不会改变自动对象的生存期,这也是问题的一个方面。正确使用智能指针可以简化生命周期管理,但在生命周期出现问题时插入智能指针并不是一个好的解决方案。虽然我喜欢这个答案,但对我来说,它似乎太通用了。我试着解释为什么我能做到最好。智能指针是我无论如何都会使用的东西,因为它们具有安全性,但我问的问题更多的是,是否可以利用动态内存分配来保持堆栈分配变量的内存分配,从而防止自动隐式销毁它。我知道,我知道,智能指针通常也不会被明确地销毁,但我希望你能明白这一点。我说清楚了吗?0_oShort回答:不可能。你能更详细地说明一下你想用这个实现什么吗?你需要多少内存?在哪个系统上有什么目的?我不认为有一种干净的方法可以用new来实现这一点,但是new使用了像sbrk这样的系统调用,它分配了大量的池,您可以使用placement news在那里构建对象。但这完全取决于你想用它实现什么。附言:闻起来像垃圾收集或泄漏检测。简短回答:不可能。你能更详细地说明一下你想用它实现什么吗?你需要多少内存?在哪个系统上有什么目的?我不认为有一种干净的方法可以用new来实现这一点,但是new使用了像sbrk这样的系统调用,它分配了大量的池,您可以使用placement news在那里构建对象。但这完全取决于你想用它实现什么。注:闻起来像垃圾收集或泄漏检测。