aca*_*day 4 c++ memory-leaks memory-management
我被指派在MFC中处理一些遗留的C++代码.我在这个地方找到的一件事是分配如下:
struct Point
{
float x,y,z;
};
...
void someFunc( void )
{
int numPoints = ...;
Point* pArray = (Point*)new BYTE[ numPoints * sizeof(Point) ];
...
//do some stuff with points
...
delete [] pArray;
}
Run Code Online (Sandbox Code Playgroud)
我意识到这个代码在如此多的层面上是非常错误的(C风格演员,使用new类似malloc,混乱等).我也意识到如果Point已经定义了一个构造函数,那么它就不会被调用,delete []如果定义了一个析构函数,就会发生奇怪的事情.
问题: 我正在修理这些事件的过程,无论它们出现在哪里.但是,我以前从未见过这样的东西,它让我感到疑惑.此代码是否有可能导致内存泄漏/损坏,因为它当前(没有构造函数/析构函数,但指针类型不匹配)或只要数组只包含结构/基元类型,它是否安全?
正式的代码使得由于在指针类型不匹配的未定义的行为new[]/ delete[].在实践中它应该工作正常.
通过向delete-expression添加强制转换,可以轻松修复指针类型不匹配问题
delete [] (BYTE *) pArray;
Run Code Online (Sandbox Code Playgroud)
如果Point类型定义为问题中所示(即使用简单的构造函数和析构函数),则此更正将解决此代码中存在的所有正式问题.从语言的角度来看,具有普通构造函数(析构函数)的对象的生命周期与其存储持续时间同时开始(结束).即,不需要执行构造函数(析构函数)的实际调用.
| 归档时间: |
|
| 查看次数: |
1216 次 |
| 最近记录: |