使用 <allocation-function> 分配的内存正在使用 <错误的释放函数> 进行解除分配。 请改用“<correct-deallocation-function>”。
此规则已在 Visual Studio 2026 18.0 中添加。
注解
此警告指示内存是使用一种分配函数族进行分配的,但使用不同族的解除分配函数进行了释放。 根据 C/C++ 及 Microsoft MSVC 实现,此用法会导致行为未定义。
这种缺陷的具体影响难以预测。 对于具有执行内存解除分配功能的析构函数的类,这可能会导致泄漏。 对于具有执行语义上重要操作的析构函数的类,或者可能导致内存损坏和崩溃的情况,它可能会导致不一致的行为。 在其他情况下,不匹配可能并不重要,具体取决于编译器及其库的实现。 分析工具不一定总是能够区分这些情况。
如果使用一系列分配函数分配内存,则应使用匹配的解除分配函数释放内存。
C26865 涵盖以下分配/解除分配对:
- C++标量 new (
new)必须用标量 delete(delete)释放。 - C++中的 array new 操作(
new[])必须使用 array delete 操作(delete[])进行释放。 - C/C++
malloc/calloc/realloc必须使用free(或realloc)进行解除分配。 - 必须使用
HeapFree解除分配HeapAllocWindows。 - 必须使用
GlobalFree解除分配 WindowsGlobalAlloc。 - Windows
LocalAlloc必须用LocalFree来解除分配。 - 必须用
MIDL_user_free解除分配MIDL_user_allocateWindows。 - 组件对象模型 (COM)
CoTaskMemAlloc必须解除分配CoTaskMemFree。
代码分析名称:ALLOCATION_DEALLOCATION_MISMATCH
Example
以下示例代码生成警告 C26865:
void f() {
int *pInt = (int *)calloc(10, sizeof(int));
// code ...
delete pInt; // C26865: Memory allocated with 'calloc' is being deallocated with 'delete'. Use 'free' instead.
}
void g() {
char * str = new char[50];
// code ...
delete str; // C26865: Memory allocated with 'new[]' is being deallocated with 'delete'. Use 'delete[]' instead.
}
手动内存管理在内存泄漏和异常方面有许多缺陷。 若要完全避免这些潜在的泄露问题,请使用 C++ 标准库 (STL) 提供的机制。 这些机制包括 shared_ptr和 unique_ptr容器,例如 vector。 有关详细信息,请参阅智能指针和 C++ 标准库。