Сбой нарушения векторного доступа VC++ 6.0. Известная ошибка?

Я пытаюсь использовать std::vector‹>::const_iterator и получаю сбой «нарушение прав доступа». Похоже, код std::vector дает сбой, когда использует собственные внутренние указатели First_ и Last_. Предположительно, это известный баг. Я надеюсь, что кто-то может указать мне правильный обходной путь. Вероятно, имеет значение, что функция сбоя вызывается из внешней библиотеки?

const Thing const*  AClass::findThing (const std::string& label) const
{
    //ThingList_.begin() blows up at run time.  Compiles fine.
    for (std::vector<Thing*>::const_iterator it = ThingList_.begin(); it != ThingList_.end(); ++it) {
        //Irrelevant.
    }
    return 0;
}

Простой вызов ThingList_.size() также приводит к сбою.

Это sp6, если это имеет значение.


person kingkongrevenge    schedule 03.03.2009    source источник
comment
Где вы размещаете ThingList_ ?   -  person jdigital    schedule 04.03.2009
comment
Может быть, глупый вопрос, но что такое ThingList_?   -  person John    schedule 04.03.2009
comment
ThingList_ размещается в собственном конструкторе. Это вектор. Он живет как частный член AClass. ThingList_ — это вектор указателей на объекты, как показано в объявлении итератора.   -  person kingkongrevenge    schedule 04.03.2009
comment
Я бы попросил вас опубликовать больше кода, а также объяснить, что вы подразумеваете под внешней библиотекой - статической .LIB, DLL?   -  person    schedule 04.03.2009
comment
Просто заметка из моего опыта с похожей проблемой, которая меня действительно беспокоила. Оказалось, что я не вызвал функцию к нужному объекту (я привел базовый класс (который не имеет этого вектора) в качестве производного класса и вызвал его; вот где возникла проблема.) Извлеченный урок: Никогда не кодируйте в 03:50.   -  person MasterMastic    schedule 06.09.2012


Ответы (3)


Если вы передаете объекты C++ через границы внешней библиотеки, вы должны убедиться, что все библиотеки используют одну и ту же библиотеку времени выполнения (в частности, один и тот же распределитель кучи). На практике это означает, что все библиотеки должны быть связаны с DLL-версией MSVCRT.

person Greg Hewgill    schedule 03.03.2009
comment
Когда-то у нас была та же проблема с векторами. Передача их через границы DLL вызывала головную боль, даже при использовании тех же библиотек CRT. Я считаю, что они исправили это в более поздних выпусках. Во всяком случае, у нас давно не было подобных проблем. - person Joe; 04.03.2009

Это почти наверняка ошибка в вашем коде, а не std::vector. Этот код используется слишком многими проектами, чтобы иметь такую ​​легко воспроизводимую ошибку.

Скорее всего, переменная ThnigList_ была каким-то образом повреждена. Был ли прямой доступ к базовому массиву и/или он был изменен?

person JaredPar    schedule 03.03.2009
comment
Google говорит, что в этой реализации STL есть множество ужасных ошибок. Помните, VC6 древний. Я внимательно рассмотрю поток управления, работающий с ThingList_, но это довольно прямолинейная частная переменная-член. Я не вижу никаких приведения или указателей на него прямо сейчас. - person kingkongrevenge; 04.03.2009
comment
@kingkongrevenge, да, есть ошибки, но невозможность повторить простой вектор была бы остановкой корабля - person JaredPar; 04.03.2009
comment
Одна из обнаруженных мной ошибок заключалась в том, что вы просто не можете использовать std::map в разделяемых библиотеках. Я бы подумал, что корабельная пробка, но видимо не поймали. Я думаю, что это ошибка, и она связана с тем, как связан мой проект. - person kingkongrevenge; 04.03.2009

Я согласен с Джаредом, что это, вероятно, в вашем коде, тем не менее, вы должны быть уверены, что ваши библиотеки stl обновлены.

На сайте dinkumware есть нужные вам исправленные файлы.

Вы должны обновить, чтобы быть в безопасности

person EvilTeach    schedule 03.03.2009
comment
Если вектор никогда не используется, что еще может его испортить? После того, как я дважды проверю, что AClass и вектор никогда не используются неправильно, у меня закончились идеи. И я почти уверен, что они не брошены. - person kingkongrevenge; 04.03.2009
comment
Я не говорю о коррупции отношения актеров. Я указываю, что ваш файл #include ‹vector› может быть устаревшим, и даю вам ссылку на место, где можно найти обновления. :) - person EvilTeach; 04.03.2009
comment
Не глядя на ваш код, я не мог догадаться. C и C++ хорошо известны дефектами, связанными с границами. - person EvilTeach; 04.03.2009
comment
Я рад, что сохранил их, хотя я ушел от 6. - person EvilTeach; 06.11.2012