最近,我了解到C++程序员之间已经达成共识,应尽可能避免newdeletedelete[]运算符,就像已经讨论过hereherehere一样。在搜索时,我甚至偶然发现April Fools' joke,说明这些运算符将在C++ 20中被弃用。

我碰巧编写和维护以这种语言编写的C / C++程序,以便进行其他程序员编写的有用的库和类。由于它必须在非常有限的环境中运行(即,在程序方面最低限度的旧Linux发行版),因此我不能依靠C++ 11和更高版本(如smart pointers)带来的功能,并且我坚持到现在混合C和Java编程习惯,同时扩展程序。除其他外,我经常对newdelete使用动态分配-当然,这听起来是个问题。

为了简化将来的程序员对我的代码的维护,我想在我的代码中最小化带有所述关键字的动态分配。问题是我的程序必须管理用于(几乎)整个执行的一些非常大的数据结构。结果,我很难弄清楚为什么在这种情况下应该避免动态分配。

为简化起见,请考虑我有一个值(value)10兆字节的数据结构(建模为对象),该数据结构用于程序的整个执行,并且内存中的大小会随时间增加。我的问题如下:

  • 在这种特定情况下,使用new动态分配对象仍然不是一个好习惯吗?有哪些更好的选择?
  • 现在假设我在程序中某个地方实例化了一个新对象而不使用new,对该对象进行了一些操作,这可能会稍微改变其大小,然后使用一种方法将其插入到我的数据结构中。如果使用自动分配(如上所述here),它如何在内存方面工作?

  • 提前谢谢了。

    最佳答案

    您可以尝试使用Boost智能指针。

    https://www.boost.org/doc/libs/1_71_0/libs/smart_ptr/doc/html/smart_ptr.html

    它们与C++ 11智能指针非常相似,但可以在C++ 11之前的环境中使用,可以作为库使用。如果您决定采用这种方式,则可能还需要考虑一下

    How to include only BOOST smart pointer codes into a project?

    现在,我想知道您是否一般会将新功能/删除功能与动态分配相混淆。智能指针仍然是动态分配,但是它们能够清理自身,因此您也不必记住。这就是为什么它们比使用new / delete(malloc / free等)更受青睐的原因,它们导致内存泄漏的可能性要小得多。

    当对象寿命允许时,自动分配是可以的,但是如果您需要将该对象保留在声明了它的函数之外,则需要动态分配内存。

    10-08 04:54