显式销毁非指针静态对象

问题描述

| 我正在使用Autodesk Maya api,并且
MLibrary::cleanup
函数\“ ...防止执行任何静态析构函数。\”源代码 使用Maya api的代码还使用了我的一些dll,其中包含需要销毁的非指针静态变量(特别是包含class1ѭ的Log类,需要编写页脚并关闭文件流)。 处理此问题的适当方法是什么?我添加了一个名为
stdLog.~Log();
Log::destroy()
函数,这样安全吗?     

解决方法

也许是安全的,也许不是。最好对代码进行结构化,以使其无关紧要。与其让
destroy
~Log
,不如让
~Log
destroy
。也要进行“ 4”检查,以检查物体是否已经被破坏;如果必须的话,请添加一个布尔变量以对此进行跟踪。     ,我会将静态对象移到堆对象中,并添加一个调用以允许干净关闭。 如果在非动态对象上显式调用析构函数,则在正常程序终止的情况下,析构函数将被调用两次,这对IMO不利。 使用显式关机调用可以正确处理这两种情况(即不关机的正常终止和显式关机后的正常终止)。 以我的经验,具有“复杂”静态实例通常是一个问题,因为您无法精确控制何时创建它们以及何时销毁它们。如果由于任何原因构造或破坏都可能失败,那么确保将这些对象用作静态工期实例意味着您正在寻找麻烦。 同样以我的经验,调试在
main
的第一条指令之前或返回之后发生的问题比常规调试还要困难(例如,在Windows中程序关闭期间发生的段错误通常被OS静默,而在启动之前则进行调试)。 main可能无法按预期工作)。 多年来,我已经从懒惰的初始化/销毁转向了受控的确定性方法来启动/关闭(如果可能的话),而且我不回头。     ,如果确实从未调用过您的ѭ10的析构函数,那么是的,它是安全的。     ,您可以获取\“ Static Storage Duration \”对象以注册
atexit()
on_exit()
清理方法作为构造的一部分,而在销毁过程中不执行任何操作。 然后,注册的方法可以完成您需要的清理工作(例如在日志上打印页脚)。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...