class System
{
public:
virtual ~System() final { Shutdown(); };
virtual void Shutdown() = 0;
}
class DerivedSystem : public System
{
public:
virtual void Shutdown() override;
private:
Object* MySelfAllocatedObj;
}这是我的用例
我有一个管理器,它持有由其他各种“模块”注册的系统*的列表,每个系统*实际上都是被嘲笑的类,系统管理器不知道。
当它们各自的系统*结束/死亡时,这些模块将请求关机()。
那么,如果其中一个DerivedSystem有一个MySelfAllocatedObj (ptr),并将其作为MySelfAllocatedObj()的一部分销毁,那么我的内存会使用当前的体系结构正确地清理吗?
我这样做是为了限制“销毁”函数(即析构函数/关机)的数量,但不希望将析构函数公开给请求该DerivedSystem的“模块”。
如果一个DerievedSystem类声明一个析构函数,会发生什么?
编辑:添加:公共系统(继承)
问题不是我是否应该,问题是,我的记忆是否会被管理员正确地清理掉?
delete System* 或由请求模块(第三方)调用
SystemManager->RequestShutdown(SystemID...) { System->Shutdown()};这两条路都会以同样的“记忆被清除”收场,还是我会错过什么?
重点是不要在这两个函数中重复代码。
发布于 2018-08-01 12:05:39
在析构函数中,任何派生对象的生存期已经结束,就像构造函数中的一样,任何派生对象的生存期尚未开始。对析构函数(或构造函数)中的虚拟函数的调用将被静态地分派,因为不再有派生对象(或者在构造函数情况下还不存在派生对象)可以将其动态地分派到该对象。除非您定义了System::Shutdown,否则程序不太可能成功地链接。
此外,声明基final的析构函数将阻止您派生这样的基,因为即使是派生类的隐式生成析构函数也将是“覆盖”。
如果我的记忆被经理破坏了,我的记忆会被正确地清理吗? 删除系统*
您的伪代码不清楚,但根据我的描述,您删除了System*类型的指针。
不,因为1. DerivedSystem::shutdown从来不被调用,2. DerivedSystem格式不正确,因为它覆盖了最终的析构函数,并且程序不太可能编译。
系统管理器->RequestShu倒计时(SystemID.){System->关机()};
这将调用DerivedSystem::shutdown,因此它应该在这方面起作用。尽管如此,这门课的不良结构仍然是个问题。
当它们各自的系统*结束/死亡时,这些模块将请求关机()。 我这样做是为了限制“销毁”函数(即析构函数/关机)的数量
如果您想限制销毁函数的数量,一个简单的解决方案就是根本不提供一个Shutdown函数,而是让系统在其应该死的时候摧毁它们各自的系统。
如果您确实需要一个单独的Shutdown函数(我不建议这样做),并且希望在析构函数中重用它,那么您需要在每个派生类的析构函数中调用它。
PS。显式删除和指向拥有资源的裸指针非常容易出错。最好用智能指针代替。
https://stackoverflow.com/questions/51631926
复制相似问题