C++动态分配不匹配:这有问题吗?

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 []如果定义了一个析构函数,就会发生奇怪的事情.

问题: 我正在修理这些事件的过程,无论它们出现在哪里.但是,我以前从未见过这样的东西,它让我感到疑惑.此代码是否有可能导致内存泄漏/损坏,因为它当前(没有构造函数/析构函数,但指针类型不匹配)或只要数组只包含结构/基元类型,它是否安全?

AnT*_*AnT 6

正式的代码使得由于在指针类型不匹配的未定义的行为new[]/ delete[].在实践中它应该工作正常.

通过向delete-expression添加强制转换,可以轻松修复指针类型不匹配问题

delete [] (BYTE *) pArray;
Run Code Online (Sandbox Code Playgroud)

如果Point类型定义为问题中所示(即使用简单的构造函数和析构函数),则此更正将解决此代码中存在的所有正式问题.从语言的角度来看,具有普通构造函数(析构函数)的对象的生命周期与其存储持续时间同时开始(结束).即,不需要执行构造函数(析构函数)的实际调用.

  • 在这种情况下,使用`std :: vector <Point>`而不用担心任何事情. (3认同)
  • 为什么不把配置修改为`new Point [numPoints];`因为那才是真正发生的事情? (2认同)