为std :: vector抑制lint 429(保管指针未被释放或返回)?

时间:2014-07-21 15:49:09

标签: c++ vector destructor lint

我的Blah类有代码创建一个新的Bling(一个普通的旧数据结构)并将它放入一个std :: vector中:

Bling * const bling = new Bling;
m_Blings.push_back ( bling );

新的Bling最终被Blah的析构函数释放了:

try
{
    while ( m_Blings.size() > 0 )
    {
        Bling *bling = m_Blings.back();
        m_Blings.pop_back();
        try { delete bling; } catch ( ... ) {}
    }
}
catch (...)
{
}

Lint(特别是PC-lint)在分配新Bling的行上发出警告429,"保管指针' bling'没有被释放或退回"。

我理解Lint可能很难认识到这一点,但我正在释放它(在析构函数中)。所以我想压制这个消息。但是我不想单独压制我所做的每一个std :: vector< ...> :: push_back,所以我搜索了一个更好的方法。这次搜索引发了以下Stack Overflow问题:

How can I tell lint to track a custodial pointer to a vector?

在那里,建议将以下行添加到.lnt文件中:

-sem(std::vector::push_back, custodial(1))

基本上意思是" std :: vector将作为第一个参数传递的指针保管到其push_back函数"。这个建议适用于该主题中的至少两个人,包括原始提问者。

但我把它放在我的选项中。它不适合我。而且,我真的不明白为什么首先会工作。我知道它会让Lint知道"这个小的本地代码不负责释放或返回这个新对象"但我不明白为什么它会让lint知道对象是最终实际上在别处释放了。也就是说,我不知道皮棉怎么会知道"回来"在我的析构函数中调用必然会返回我通过push_back添加到向量中的对象,因此我不知道lint如何知道" delete"我正在做的就是我添加的对象。

那么,有没有人知道如何处理这种情况,除了"每次调用std :: vector :: push_back时添加一个抑制注释(和类似的函数,包括在其他std容器上) "

0 个答案:

没有答案