我应该在c++中删除指向应用程序生命周期变量的指针吗?
c++ should i bother deleting pointers to application lifetime variables?
我有一些"全局"结构,它们被分配为new,并且在整个应用程序生命周期中都是活跃的。
我应该在应用程序结束之前对指针调用delete吗?难道不是所有的应用程序的内存被回收后,它关闭?
编辑清晰。我只是在谈论不要对那些在程序关闭时"死亡"的生命周期对象调用delete。
从技术上讲,是的,内存被回收。但是,除非使用delete
,否则不会运行这些对象的析构函数,也不会应用它们的副作用。这可能导致临时文件未被删除或数据库更改未提交,具体取决于这些析构函数的目的。
也别忘了墨菲。现在,用于管理这些对象的代码按照您的描述使用(对象必须在程序的生命周期中持续存在),但稍后您可能希望重用这些代码,以便多次运行。除非它能够正确地重新创建对象,否则它将会泄漏对象。
清理所有内容总是好的做法,尽管内存被回收,但这些对象可能分配了其他资源(共享内存,smeaphores等),这些资源应该被清理,可能是由对象的析构函数。
如果您不想调用delete,请使用共享指针来保存这些资源,以便在应用程序退出时正确地清理它们。你如何测试你的应用程序?不进行清理可能会阻碍一个体面的测试工具的开发。应用程序的测试可能需要一种欺骗关闭和重新启动的方法。
不,不要编写/调试/维护代码来做操作系统已经很擅长的事情。
除非有相反的具体原因,(例如……)待提交的未完成事务,待刷新的文件,待关闭的连接),我不会费心写代码去做操作系统无论如何都会做的事情。如果医生不做什么特别的事,为什么还要打电话呢?
许多开发人员在应用程序关闭时投入了大量精力来删除/销毁/释放/终止内容-这是为了避免在应用程序关闭时从内存管理器中产生一些虚假的"泄漏报告",而内存管理器本身即将被销毁。
我认为你可能是对的,但我个人认为依赖系统是糟糕的编码和糟糕的做法,并确保我的代码在关闭时总是正确整理。
没有唯一的正确答案。大多数时候,它可能不会物质,但是有析构函数做一些重要的事情只是释放内存(我有一个删除临时文件),这主张清理;另一方面,销毁这样的对象可能导致销毁顺序问题,如果对象被使用其他对象的析构函数。我的基本原则是不破坏,除非析构函数做的不仅仅是释放内存,但是其他人可能更喜欢不同的默认设置。
除了不执行析构函数(如尖牙指针指向外)之外,删除全局对象以使内存检查器满意也是值得的。特别是如果您的代码是在共享库中—您不希望仅仅因为没有正确删除而使其内存检查器(例如,Valgrind)输出混乱。
…还有一些情况,你绝对不希望在操作系统终止进程之前调用医生,例如:
1)当医生不能正常工作,因为它试图终止一个线程,失败和阻塞线程句柄或其他信号,(常年'join/waitFor'死锁)-导致99%的家庭'我的应用程序不会干净地关闭'帖子。
2)当医生不能正常工作时,因为它只是坏了,埋在图书馆里。
3)内存必须比进程线程活得长,否则在关闭时将出现段错误/AV,(例如。(线程在关闭时可能正在写入的缓冲区对象池)。
4)任何其他必须留给操作系统销毁对象/s的"特殊情况"。
有太多的"特殊情况",我把"清理"关机代码作为特殊情况。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 是否可以通过使用移动/交换 c++11 来延长返回的临时变量的生命周期
- 我想知道在构造函数中初始化变量时的生命周期
- 我应该在c++中删除指向应用程序生命周期变量的指针吗?
- 使用goto传递POD堆栈变量时的作用域和生命周期
- 在我的代码中,scoped_ptr指向一个堆栈变量 - 这是否延长了堆栈变量的生命周期
- 命名空间中变量的生命周期
- 绑定到已销毁堆栈变量的const引用的生命周期
- c/c++中局部变量作用域和生命周期的混淆