警告 C26414
“移动、复制、重新分配或重置本地智能指针。”
C++ Core Guidelines:
R.5:首选范围内的对象,请勿进行不必要的堆分配
智能指针适用于动态资源管理,但并非总是必要的。 例如,使用标准容器管理本地动态缓冲区可能更简单、更高效。 例如,如果单个对象的生存期不会长于其创建者函数,则根本不需要进行动态分配。 可以将它们替换为局部变量。 当方案需要更改所有权时,使用智能指针会很方便。 例如,多次或在多个路径中重新分配动态资源时。 对于从外部代码获取的资源,智能指针也很有用。 智能指针也可用于延长资源的生存期。
注解
此检查可识别标准 std::unique_pointer
和 std::shared_pointer
模板,以及可能用作智能指针的用户定义类型。 此类类型应定义以下操作:
未标记为已删除的公共重载取消引用或成员访问运算符;
未删除或非默认的公共析构函数。 包括显式定义为空的析构函数。
Microsoft::WRL::ComPtr
类型起到共享指针的作用,但它通常用于受 COM 生存期管理影响的特定方案。 为了避免过度干扰,会筛选掉此类型。
此检查查找分配给智能指针的显式本地分配,以确定范围内的变量是否可以用作替代方法。 对运算符 new
和特殊函数(如 std::make_unique
和 std::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());
// ...
}