我正在编写一个类(virtual_flight_runtime_environment),它主要是非静态的,除了一个静态函数之外,Win32线程使用它作为函数。该类声明struct simaircraftdata * aircraftdata(一个数据结构),并调用'aircraftdata = new aircraftdata;'在constuctor中(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'将超出范围,并且应该调用desturctor。
这是对的吗?我注意到随着时间的推移内存使用量不断增加,我想知道我是否做错了什么。在指针上调用delete只是使它成为空指针,还是在它的末尾解除分配数据?
任何建议都将不胜感激,
科林·比登卡普(Collin Biedenkapp)答案 0 :(得分:1)
你几乎是正确的。
delete this_environment
调用virtual_flight_runtime_environment
的析构函数。析构函数执行delete aircraftdata
。
在此之后,释放virtual_flight_runtime_environment
实例占用的内存。
请注意,delete
语句未将指针设置为NULL
。
因此,鉴于问题中的信息,我的代码中没有问题。
答案 1 :(得分:1)
这看起来是正确的。 在this_environment上调用delete将导致在释放内存之前调用该类的析构函数。析构函数删除飞机数据。看起来不错。
您可以考虑使用 auto_ptr 或使用 auto_ptr 或在c ++ 11中 unique_ptr 而不是包含指向 aircraftdata 的原始指针的成员变量这将确保在构造包含类时自动删除它。看一下,这不是教它的地方,这只是一个建议,而不是必需品。
编辑:我也同意Pete Becker关于这个问题的评论,该评论是否需要一个指针。
答案 2 :(得分:1)
程序中的删除与在任务管理器中是否直接可见之间没有直接关联,因为操作系统会尝试优化内存利用率。当您查看任务管理器时,您通常会看到应用程序的工作集大小,这可以衡量应用程序请求的内存量,但不一定是当前使用的内存量。
对于你的问题,是的,你正在删除内存是WTG,尽管其他人已经指出使用智能指针通常更好地处理内存以避免以后的头痛。
答案 3 :(得分:0)
你的确应该明确地称之为“删除this_environment”。否则,它只是指针本身(存在于堆栈中)将被销毁。堆上指出的数据仍然存在。
另一种解决方案是简单地删除指针并声明你的变量:
virtual_flight_runtime_environment this_environment;
这样,你的对象将直接存在于堆栈中,它的生命周期将取决于它的声明范围 - 此时将自动调用析构函数,然后调用内部数据的删除。