VC++全局operator delete标量参数被忽略的技术问询
operator delete忽略size参数的解惑 嘿,这个细节我当初第一次撞见的时候也懵了一下!咱们来掰扯清楚为啥会出现这种情况:
标量
operator delete的设计逻辑:MSVC里对应单个对象回收的标量版operator delete,确实会直接忽略你传入的size参数。原因很简单——当你用new分配单个对象时,堆管理器早就把这块内存的大小记录在内存块的元数据里了,回收的时候直接从元数据里读就行,根本不需要额外传size。所以这个参数在这里就是个“凑数的”,实现里忽略它完全合理。函数重载的匹配逻辑:你调用的
::operator delete((void*)m_data, size() * sizeof(T));会匹配到全局重载里的void operator delete(void*, std::size_t)版本,但MSVC把这个重载的标量实现和不带size的版本做了统一处理,直接跳过了第二个参数。要是换成数组版的operator delete[],情况可能会不一样(不过有些实现里数组版也可能不用size,毕竟元数据同样有记录)。标准允许这种操作:C++标准并没有强制要求带
size参数的operator delete必须用上这个参数,只是提供了一个可选重载让实现做优化。所以MSVC的这种写法完全符合规范,算不上“bug”。
你提到的scalar_delete.cpp里的代码片段大概是这样的:
// delete_scalar_size.cpp
// Copyright (c) Microsoft Corporation. All rights reserved.
...
(实现代码里直接忽略了传入的size参数)
最后补一句,虽然这个参数被忽略了,但你的程序崩溃大概率和这个无关——毕竟你也说崩溃不是疑问点,只是这个细节让你意外而已😉
内容的提问来源于stack exchange,提问作者MivVG

