警告 C26414

“移动、复制、重新分配或重置本地智能指针。”

C++ Core Guidelines:
R.5:首选范围内的对象,请勿进行不必要的堆分配

智能指针适用于动态资源管理,但并非总是必要的。 例如,使用标准容器管理本地动态缓冲区可能更简单、更高效。 例如,如果单个对象的生存期不会长于其创建者函数,则根本不需要进行动态分配。 可以将它们替换为局部变量。 当方案需要更改所有权时,使用智能指针会很方便。 例如,多次或在多个路径中重新分配动态资源时。 对于从外部代码获取的资源,智能指针也很有用。 智能指针也可用于延长资源的生存期。

注解

此检查可识别标准 std::unique_pointerstd::shared_pointer 模板,以及可能用作智能指针的用户定义类型。 此类类型应定义以下操作:

  • 未标记为已删除的公共重载取消引用或成员访问运算符;

  • 未删除或非默认的公共析构函数。 包括显式定义为空的析构函数。

Microsoft::WRL::ComPtr 类型起到共享指针的作用,但它通常用于受 COM 生存期管理影响的特定方案。 为了避免过度干扰,会筛选掉此类型。

此检查查找分配给智能指针的显式本地分配,以确定范围内的变量是否可以用作替代方法。 对运算符 new 和特殊函数(如 std::make_uniquestd::make_shared)的直接调用都会解释为直接分配。

代码分析名称:RESET_LOCAL_SMART_PTR

示例

动态缓冲区:

void unpack_and_send(const frame &f)
{
    auto buffer = std::make_unique<char[]>(f.size()); // C26414
    f.unpack(buffer.get());
    // ...
}

替换为容器的动态缓冲区:

void unpack_and_send(const frame &f)
{
    auto buffer = std::vector<char>(f.size());
    f.unpack(buffer.data());
    // ...
}