gpt4 book ai didi

c++ - 清理 "application lifetime"对象的必要性

转载 作者:太空狗 更新时间:2023-10-29 20:05:43 26 4
gpt4 key购买 nike

我们继承了大型遗留应用程序,其结构大致如下:

class Application
{
Foo* m_foo;
Bar* m_bar;
Baz* m_baz;

public:

Foo* getFoo() { return m_foo; }
Bar* getBar() { return m_bar; }
Baz* getBaz() { return m_baz; }

void Init()
{
m_foo = new Foo();
m_bar = new Bar();
m_baz = new Baz();

// all of them are singletons, which can call each other
// whenever they please
// may have internal threads, open files, acquire
// network resources, etc.
SomeManager.Init(this);
SomeOtherManager.Init(this);
AnotherManager.Init(this);
SomeManagerWrapper.Init(this);
ManagerWrapperHelper.Init(this);
}

void Work()
{
SomeManagerWrapperHelperWhateverController.Start();

// it will never finish
}

// no destructor, no cleanup
};

所有管理器一旦创建就会在整个应用程序生命周期内保持不变。该应用程序没有关闭或关闭方法,管理器也没有这些方法。因此,永远不会处理复杂的相互依赖关系。

问题是:如果对象的生命周期与应用程序的生命周期紧密相关,那么根本不进行清理是否可以接受?一旦进程结束(通过在任务管理器中结束它或调用特殊函数,如 ExitProcess、Abort、 ETC。)?上述方法可能存在哪些问题?

或者更一般的问题:析构函数对于全局对象(在 main 之外声明)是否绝对必要?

最佳答案

Will the operating system (Windows in our case) be able to cleanup everything (kill threads, close open file handles, sockets, etc.) once the process ends (by ending it in task manager or by calling special functions like ExitProcess, Abort, etc.)? What are possible problems with the above approach?

只要您的对象没有初始化操作系统清理的任何资源,那么无论您是否明确清理都没有任何实际区别,因为操作系统会当您的进程终止时,为您清理。

但是,如果您的对象正在创建操作系统未清理的资源,那么您就会遇到问题,并且需要在您的应用程序中的某处使用析构函数或其他一些明确的清理代码。

考虑这些对象之一是否在某些远程服务(例如数据库)上创建 session 。当然,操作系统不会神奇地知道这已经完成或者当你的进程死亡时如何清理它们,所以这些 session 将保持打开状态直到某些东西杀死它们(DBMS 本身可能通过强制执行一些超时阈值或其他) .如果您的应用程序是资源的小用户并且您在大型基础架构上运行,那么这可能不是问题 - 但如果您的应用程序创建然后孤立了足够多的 session ,那么该远程服务上的资源争用可能会开始成为问题。

if the objects lifetime is tightly coupled with the application lifetime, is it accepted practice to not have cleanup at all?

这是一个主观争论的问题。我个人的偏好是包括明确的清理代码,并让我创建的每个对象在可行的情况下亲自负责清理自身。如果应用程序生命周期对象曾经被重构,以至于它们不再存在于对象的生命周期中,我就不必回过头来弄清楚是否需要添加以前忽略的清理。我想为了清理我是说我通常更喜欢倾向于 RAII越过越务实YAGNI .

关于c++ - 清理 "application lifetime"对象的必要性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12001367/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com