Я получаю предупреждение #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;
}
На мой взгляд, единственная странная линия
_Libs[x] = '\0';
Это может заставить анализатор думать, что вы храните символы вместо указателей. Поскольку вы все равно стираете элемент, он вам на самом деле не нужен — удалите его и посмотрите, решит ли он вашу проблему.
Эта линия
_Libs.erase(_Libs.begin()+x);
проходит vector::iterator
к функции, ожидающей vector::const_iterator
, Это нормально и требуется для работы (но стандарт не говорит точно как это работает, просто это iterator
может быть преобразован в const_iterator
).
На вашей реализации, похоже, iterator
происходит от const_iterator
и передача параметра преобразует его в базовый класс путем «вырезания» из производной части.
В этом случае это не ошибка, и предупреждение можно игнорировать.