Мы не приводим полный пример, но я предполагаю, что вы делаете другие манипуляции между созданием и использованием итератора.
Итераторы не гарантируются действительными после различных операций над контейнером. Вы должны не сохранить их.
Готов поспорить, что это сработает?
class MyController
{
public:
MyController() : title("Hello World") {}
void onCreate(xMessage *msg);
{
MessageBox(NULL, title.c_str(), "Title", MB_OK);
}
protected:
std::string title; // generic lists of strings with
// magic indexes are hard to maintain.
};
Это также легче читать и отлаживать, что стоит намного дороже, чем любая другая часть разработки программного обеспечения.
По большей части вы должны использовать итераторы в качестве временных объектов. Редко они выходят за пределы области действия функции / метода.
struct some_struct {
some_struct() {
gui_text.push_back( std::string("Hello World!") );
}
void some_function() {
std::list<std::string>::iterator iter = gui_text.begin();
for (; iter != gui_text.end(); iter++) {
std::cout << *iter << std::endl;
}
}
std::list<std::string> gui_text;
};
Такие вещи, как добавление, удаление и т. Д. Из контейнера, лишают законной силы итераторы. Так что просто воссоздайте итератор в каждой точке. Строки и итераторы довольно легки, поэтому вам не нужно беспокоиться об оптимизации таким способом. На самом деле.