类析构函数和指针释放
Class destructors and pointer deallocation
我正在编写一个类(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。
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 如何在向量中释放指针?
- 在C++中释放内存期间,迭代器与指针有何不同
- 包含矢量指针的结构的内存释放问题
- 错误:malloc:对象 0x7f9edf504080 的 *** 错误:未分配正在释放的指针
- 错误:释放指针未分配在矢量模板类C 中
- 如何在指针初始化为数组的第一个索引后释放指针
- 如何释放指针树中的所有内存
- 从 std::align 中释放指针
- C :释放指针没有分配在课堂上
- 构造向量 C++ 后无法释放指针
- nullptr是否释放指针的内存
- C/C++ 通过调用引用或直接释放指针
- 分段释放指针向量的错误
- 有效地从指向对象本身释放指针
- 如何释放指针向量中的元素
- Sqlite c/c++api,负责从sqlite3_column_text中释放指针
- 释放指针后分配给指针
- 正在释放指针