Предупреждение Intel Inspector XE 2012 # 12367 — разделение параметра итератора, переданного в vector :: erase ()

Я получаю предупреждение #12367 when running Build | Build Solution for Intel Static Analysis, но я не вижу проблемы с моим кодом. Идеи кого-нибудь?

предупреждение # 12367: нарезка объекта, переданного в качестве фактического аргумента 2 при вызове «std :: _ Vector_iterator>> std :: vector> :: erase (std :: _ Vector_const_iterator>>)» происходит из-за неявного преобразования типов

 pragma warning(suppress: 4995)
#include <vector>

class __declspec(dllexport) MxPluginLib //nothing special here, not derived class etc
{
public:
// ...
private:
//  ... nothing special here

};class __declspec(dllexport) MxPluginManager
{
public:
//...
private:
#pragma warning(suppress: 4251)
std::vector<MxPluginLib *> _Libs;

};

bool MxPluginManager::DeleteNextUnselected()
{
bool erased = false;
size_t cnt = _Libs.size();
if (cnt > 0 )
{
for (size_t x = 0; x < cnt; x++)
{
if (_Libs[x]->GetSelection() == false)
{
delete  _Libs[x];
_Libs[x] = '\0';
_Libs.erase(_Libs.begin()+x);  //THIS IS WHERE THE WARNING IS GENERATED
erased = true;
break;
}
}
}
return erased;
}

1

Решение

На мой взгляд, единственная странная линия

_Libs[x] = '\0';

Это может заставить анализатор думать, что вы храните символы вместо указателей. Поскольку вы все равно стираете элемент, он вам на самом деле не нужен — удалите его и посмотрите, решит ли он вашу проблему.

0

Другие решения

Эта линия

_Libs.erase(_Libs.begin()+x);

проходит vector::iterator к функции, ожидающей vector::const_iterator, Это нормально и требуется для работы (но стандарт не говорит точно как это работает, просто это iterator может быть преобразован в const_iterator).

На вашей реализации, похоже, iterator происходит от const_iterator и передача параметра преобразует его в базовый класс путем «вырезания» из производной части.

В этом случае это не ошибка, и предупреждение можно игнорировать.

0

По вопросам рекламы [email protected]