【发布时间】:2011-01-09 13:33:55
【问题描述】:
在我的代码中,我实际上有以下内容:
wchar_t* buffer = new wchar_t[size];
// bonus irrelevant code here
delete[] reinterpret_cast<char*>( buffer );
所讨论的类型都是内置的,因此它们具有微不足道的析构函数。在 VC++ 中,上面的代码可以正常工作 - new[] 只是分配内存,然后 delete[] 只是释放它。
在 C++ 中可以接受吗?是未定义的行为吗?
【问题讨论】:
-
出于好奇;为什么?您根本不必在 delete 调用之前进行投射。
-
我对标准的解读是“是的,没关系”,但我真的不确定。对于其他回答者 - 坦率地说,如果没有引用标准,你的意见就不值得。
-
@acron:“不相关的代码”不是一种说法,所有权的传递有好几层,中间有强制转换。我引用的只是“有效代码”。
-
问题不只是析构函数。这就是内存管理例程 (MMR) 的实现方式。我可以看到实现中的几个选择可能会导致查找动态分配内存的 EndBlock(实现细节)的问题。任何弄乱 MMR 内部结构的东西都可能不会立即被检测到,但绝对是未定义的行为。
-
我想“为什么?”是正确的问题。它是否符合标准甚至“适用于大多数编译器和运行时”似乎无关紧要。几乎可以肯定,有更好的方法来做你想做的事。
标签: c++ visual-c++ memory-management undefined-behavior