我正在使用Cppcheck 1.75检查我的一个项目,并且此代码(为清楚起见而减少):
class TJob
{
public:
TJob(std::auto_ptr<ITask> task);
// ...
private:
std::auto_ptr<ITask> m_task;
};
TJob::TJob(
std::auto_ptr<ITask> task // <-- HERE the performance warning
): m_task(task)
{
trace("TJob ctr");
}
我收到此新的性能警告:这显然是假阳性。我认为这是一个错误,因为遵循此建议会导致严重的错误[1],但也许我错过了设置的开关,或者我可以提供一些模板来声明
auto_ptr
通过auto_ptr
传递了所有权?我在网上搜索了此信息,到目前为止,我发现的唯一结果是Cppcheck包含了对Check for invalid usage of STL的一些检查,例如
- using auto pointer (auto_ptr)
我知道,unique_ptr
不是最好的选择,但是std::auto_ptr
会不是一样吗?可能是两次检查在这里干扰了吗?除了使用inline supression之外,是否可以禁止这些情况的警告?
编辑:添加了脚注。
[1] 没有严重的错误,只有对使用ojit_code的误解。我以某种方式将编译时与运行时语义混合在一起:所有权不是通过某些编译时魔术传递的,而是在运行时通过调用“复制”构造函数传递的。
最佳答案
当可以通过引用传递并摊销其中一个副本时,它已正确检测到您正在按值传递给副本构造函数。您的优化器几乎可以肯定会为您解决“问题”,但是并没有真正需要依靠它。
我想说您的接口(interface)表达式在auto_ptr的情况下是可取的,因为它告诉调用者您正在使用指针,但是我要说的核心问题实际上是auto_ptr是一个坏公民(可以保持无效状态)通过复制操作),因此不推荐使用。
关于c++ - 按值传递的auto_ptr类型的性能误导性警告,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38826329/