警告 C26865

使用 <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
  • WindowsLocalAlloc 必须用 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_ptrunique_ptr容器,例如 vector。 有关详细信息,请参阅智能指针C++ 标准库