c++ new 不存储对象
c++ new without storing object
我接管了一些遗留的 C++ 代码(用 C++03 编写),这些代码用于在 RTOS 上运行的应用程序。在浏览代码库时,我遇到了这样的结构:
...
new UserDebug(); ///<User debug commands.
...
使用 new
完成的分配没有存储在任何地方,所以我看得更深一点,发现了这个
class UserDebug
{
public:
///Constructor
UserDebug()
{
new AdvancedDebug();
new CameraCommand();
new CameraSOG();
new DebugCommandTest();
new DebugCommand();
// 30 more new objects like this
};
virtual ~UserDebug(){};
};
我深入研究了提到的每个 class 定义和实现,但在任何地方都找不到对 delete
的任何引用。
此代码由首席软件工程师(已离开我们公司)编写。
任何人都可以就您为什么想要做这样的事情以及它是如何工作的提出一些想法吗?
谢谢
如果你查看那些 classes 的构造函数,你会发现它们有有趣的副作用,要么向某个管理器注册自己 class 要么将自己存储在 static/global 中单例指针变量。
我不喜欢他们选择那样做事——这违反了最小惊喜原则——但这并不是真正的问题。对象的内存可能(但不一定)泄漏,但它们可能在可执行文件的生命周期内存在,所以没什么大不了的。
(他们也有可能有自定义 operator new
做一些更奇怪的事情,比如构建到预分配的 static/global 存储中,尽管这只与“为什么”有点相关。)
如果这些对象创建一次,则它们可能具有应用程序的生命周期(类似于单例),因此永远不应删除。
另一种捕获指针的方法是通过重载 operator new:全局和 class 特定。检查是否有任何实现某种垃圾收集的重载。
我接管了一些遗留的 C++ 代码(用 C++03 编写),这些代码用于在 RTOS 上运行的应用程序。在浏览代码库时,我遇到了这样的结构:
...
new UserDebug(); ///<User debug commands.
...
使用 new
完成的分配没有存储在任何地方,所以我看得更深一点,发现了这个
class UserDebug
{
public:
///Constructor
UserDebug()
{
new AdvancedDebug();
new CameraCommand();
new CameraSOG();
new DebugCommandTest();
new DebugCommand();
// 30 more new objects like this
};
virtual ~UserDebug(){};
};
我深入研究了提到的每个 class 定义和实现,但在任何地方都找不到对 delete
的任何引用。
此代码由首席软件工程师(已离开我们公司)编写。
任何人都可以就您为什么想要做这样的事情以及它是如何工作的提出一些想法吗?
谢谢
如果你查看那些 classes 的构造函数,你会发现它们有有趣的副作用,要么向某个管理器注册自己 class 要么将自己存储在 static/global 中单例指针变量。
我不喜欢他们选择那样做事——这违反了最小惊喜原则——但这并不是真正的问题。对象的内存可能(但不一定)泄漏,但它们可能在可执行文件的生命周期内存在,所以没什么大不了的。
(他们也有可能有自定义 operator new
做一些更奇怪的事情,比如构建到预分配的 static/global 存储中,尽管这只与“为什么”有点相关。)
如果这些对象创建一次,则它们可能具有应用程序的生命周期(类似于单例),因此永远不应删除。 另一种捕获指针的方法是通过重载 operator new:全局和 class 特定。检查是否有任何实现某种垃圾收集的重载。