1

我正在编写一个类(virtual_flight_runtime_environment),它主要是非静态的,除了一个用于 Win32 线程的静态函数,将其用作其函数。该类声明了struct simaircraftdata* aircraftdata(一个数据结构),并调用'aircraftdata = new aircraftdata;' 在构造函数中(公共: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”将超出范围,并且应该调用析构函数。

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

任何意见,将不胜感激,

科林·比登卡普

4

4 回答 4

1

你几乎是正确的。

delete this_environment调用 的析构函数virtual_flight_runtime_environment。析构函数执行delete aircraftdata

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

请注意,该delete语句不会将指针设置为NULL.

因此,鉴于问题中的信息,我认为您的代码没有问题。

于 2012-09-04T12:59:08.250 回答
1

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

您可能会考虑使用auto_ptr或 c++11 中的unique_ptr来代替包含指向飞机数据的原始指针的成员变量, 这将确保在构造包含类时自动删除它。查一下,这里不是教它的地方,这只是一个建议,不是必需品。

编辑:我也同意皮特贝克尔对这个问题的评论,即质疑这是否需要一个指针。

于 2012-09-04T12:59:43.580 回答
1

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

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

于 2012-09-04T13:18:37.653 回答
0

您确实应该明确调用“删除 this_environment”。否则,只有指针本身(存在于堆栈中)将被销毁。指向堆上的数据仍然存在。

另一种解决方案是简单地摆脱指针并声明您的变量:

virtual_flight_runtime_environment this_environment;

这样,您的对象将直接存在于堆栈中,其生命周期将取决于声明它的范围 - 此时将自动调用析构函数,依次调用内部数据的删除。

于 2012-09-04T13:00:24.570 回答