类析构函数和指针释放

Class destructors and pointer deallocation

本文关键字:释放 指针 析构函数      更新时间:2023-10-16

我正在编写一个类(virtual_flight_runtime_environment),它大部分是非静态的,除了一个静态函数,用于Win32线程将其用作函数。该类声明structsimaircraftdata*aircraftdata(一个数据结构),并调用'aircraftdata=new-aircraftdata;'在构造函数中(public:virtual_flight_runtime_environment())。

我的问题是关于析构函数和内存释放。我已经这样写了析构函数:

    ~virtual_flight_runtime_environment(void) {
         /*..Other code, i.e. closing win32 handles, etc.*/
        delete aircraftdata;
    }

现在,该类在另一个函数(.Net后台工作程序的DoWork函数)中声明,如下所示:

    virtual_flight_runtime_environment* this_environment = new virtual_flight_runtime_environment;

就在函数结束之前,我调用"delete this_environment;"。紧接着,"this_environment"将超出范围,并且应该调用desturator。

这是正确的吗?我确实注意到随着时间的推移,内存使用量持续增加,我想知道我是否做错了什么。对指针调用delete只是使其成为空指针,还是释放指针末尾的数据?

任何建议都将不胜感激,

Collin Biedenkap

由于操作系统试图优化内存利用率,程序中的删除与任务管理器中是否直接可见之间没有直接联系。当你查看任务管理器时,你通常会看到应用程序的工作集大小,这是衡量应用程序请求的内存量的指标,但不一定是它当前使用的内存量。

对于你的问题,是的,像你那样删除内存是WTG,尽管正如其他人所指出的,使用智能指针通常可以更好地处理内存,以避免以后的麻烦。

你几乎是对的。

CCD_ 1调用CCD_ 2的析构函数。析构函数执行delete aircraftdata

紧接着,virtual_flight_runtime_environment实例占用的内存被释放。

请注意,delete语句没有将指针设置为NULL

因此,考虑到问题中的信息,我认为您的代码没有问题。

这看起来是正确的。在this_environment上调用delete将导致在释放类的内存之前调用该类的析构函数。析构函数删除飞机数据。看起来很正确。

您可以考虑不使用包含指向aircraftdata的原始指针的成员变量,而是使用auto_ptr或在c++11unique_ptr中,这将确保在构造包含类时自动删除它。查一下,这不是教它的地方,这只是一个建议,而不是必要的。

编辑:我也同意Pete Becker对这个问题的评论,即质疑这是否需要指针。

您确实应该显式调用"delete this_environment"。否则,只有指针本身(存在于堆栈上)才会被销毁。堆上指向的数据仍然存在。

另一种解决方案是简单地去掉指针并将变量声明为:

virtual_flight_runtime_environment this_environment;

这样,对象将直接存在于堆栈中,其生存期将取决于声明对象的范围,此时将自动调用析构函数,进而调用内部数据的delete。