CodeQL 文档

使用 'delete[]' 释放 'new' 对象

ID: cpp/new-delete-array-mismatch
Kind: problem
Security severity: 
Severity: warning
Precision: high
Tags:
   - reliability
Query suites:
   - cpp-security-and-quality.qls

点击查看 CodeQL 代码库中的查询

此规则查找使用指向使用 new 运算符分配的内存的指针的 delete[] 表达式。这种情况下会导致未定义的行为,应该避免。

new 运算符为一个对象分配内存,然后调用该对象的构造函数,而 delete 则执行相反的操作。然而,数组 delete[] 运算符期望指针指向数组的第一个元素(该数组可能包含指定数组长度的头数据),并将尝试对“数组”中的每个元素调用析构函数,这很可能会导致由于无效的头数据导致的段错误。

警告:此检查是近似的,因此某些结果可能不是程序中的实际缺陷。通常,在不运行程序并使用所有输入数据的情况下,无法计算指针的值。

建议

使用 delete 运算符释放使用 new 分配的内存。

示例

Record *ptr = new Record(...);

...

delete [] ptr; // ptr was created using 'new', but was freed using 'delete[]'

参考

  • S. Meyers. Effective C++ 3d ed. pp 73-75. Addison-Wesley Professional, 2005.

  • ©GitHub, Inc.
  • 条款
  • 隐私