/Zc:sizedDealloc(启用全局大小的释放函数)

/Zc:sizedDealloc 编译器选项指示编译器在对象大小可用时优先调用具有 size_t 类型的第二个参数的全局 operator deleteoperator delete[] 函数。 这些函数可以使用 size_t 参数来优化释放器性能。

语法

/Zc:sizedDealloc[-]

备注

在 C++11 标准中,你可以定义静态成员函数 operator deleteoperator delete[],这两个函数可以接受第二个参数 size_t。 通常,它们与 operator new 函数结合使用,为对象实现更有效的分配器和释放器。 但是,C++11 没有在全局范围内定义一组等效的释放函数。 在 C++11 中,具有 size_t 类型的第二个参数的全局释放函数被视为 placement delete 函数。 必须通过 size 参数来显式调用这些函数。

C++14 标准改变了编译器的行为。 当你定义带第二个类型为 size_t 的参数的全局 operator deleteoperator delete[] 时,编译器更愿意在未调用成员范围版本且对象大小可用时调用这些函数。 编译器隐式传递 size 参数。 当编译器无法确定被解除分配的对象的大小时,将调用单参数版本。 否则,关于选择要调用的解除分配函数版本的通常规则仍然适用。 对全局函数的调用可以通过将作用域解析运算符 (::) 附加到解除分配函数调用来显式指定。

默认情况下,从 Visual Studio 2015 开始的 Visual C++ 实现此 C++14 标准行为。 可以通过设置 /Zc:sizedDealloc 编译器选项来明确指定。 这代表了一个潜在的突破性变化。 使用 /Zc:sizedDealloc- 选项可保留旧行为,例如,如果你的代码定义使用 size_t 类型的第二个参数的 placement delete 运算符。 具有类型 size_t 的第二个参数的全局解除分配函数的默认 Visual Studio 库实现调用单参数版本。 如果你的代码仅提供单参数全局运算符 delete 和 operator delete[],则全局大小的解除分配函数的默认库实现会调用你的全局函数。

/Zc:sizedDealloc 编译器选项默认开启。 /permissive- 选项不影响 /Zc:sizedDealloc。

有关 Visual C++ 中一致性问题的详细信息,请参阅 Nonstandard Behavior

在 Visual Studio 开发环境中设置此编译器选项

  1. 打开项目的“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性

  2. 从“配置”下拉菜单中,选择“所有配置”

  3. 选择“配置属性”>“C/C++”>“命令行”属性页

  4. 修改“其他选项”属性以包括 /Zc:sizedDealloc 或 /Zc:sizedDealloc-,然后选择“确定”。

另请参阅

MSVC 编译器选项
MSVC 编译器命令行语法
/Zc(一致性)