gpt4 book ai didi

C++ 动态分配不匹配 : Is this problematic?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:32:40 27 4
gpt4 key购买 nike

我被指派处理 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;
}

我意识到这段代码在很多层面上都是严重错误的(C 风格转换,使用 newmalloc,令人困惑,等等)。我还意识到,如果 Point 定义了一个构造函数,它就不会被调用,而且如果定义了析构函数,delete [] 会发生奇怪的事情。

问题: 我正在理所当然地解决这些问题,无论它们出现在哪里。但是,我以前从未见过这样的事情,而且它已经让我想知道。此代码目前是否有可能导致内存泄漏/损坏(没有构造函数/析构函数,但指针类型不匹配)或者只要数组仅包含结构/原始类型就安全吗?

最佳答案

正式来说,由于 new[]/delete[] 中的指针类型不匹配,代码会导致未定义的行为。在实践中它应该工作正常。

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

delete [] (BYTE *) pArray;

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

关于C++ 动态分配不匹配 : Is this problematic?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2992237/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com