powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Пропажа данных из vector<string>
35 сообщений из 35, показаны все 2 страниц
Пропажа данных из vector<string>
    #38592673
Gijad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Столкнулся с проблемой, подскажите куда смотреть.
В работе использую visual studio 11, windows 7.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
vector<string> tools = a.gettools(files);

for (vector<string>::iterator it = tools.begin(); it != tools.end(); ++it){
  cout << "*(it1) = " << *(it) << endl;
}
//Печатает содержимое  tools при оптимизации O2 и без оптимизации

for (vector<string>::iterator it = tools.begin(); it != tools.end(); ++it){
  cout << "*(it2) = " << *(it) << endl;
}

//Печатает содержимое  tools только без оптимизации


Т.е. после первого перебора vector<string> tools убивается. Как это побороть?
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38592828
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gijad,

Ну, это странно. Не должно.
Но кто тебя знает, что там у тебя в operator << ...


Могу посоветовать только в данном случае использовать

const - объект tools

и/или

const_iterator по верктору.
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38592831
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gijad,

Кстати, тут :

Код: plaintext
1.
vector<string> tools = a.gettools(files);



могло бы быть так:

Код: plaintext
1.
const vector<string> &tools = a.gettools(files);



это возможно съэкономило бы одно лишнее копирование вектора.
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38592848
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GijadКак это побороть?
Написать багреп в МС.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38593126
Gijad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за ответы, буду смотреть.
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38593143
Gijad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С const_iterator работает как надо. Не понятно баг это или фича.
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38593152
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gijad,

А у тебя repro есть ?
Маленький код, который это воспроизводит...
Если есть -- поделись.
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38593155
Gijad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivGijad,

А у тебя repro есть ?
Маленький код, который это воспроизводит...
Если есть -- поделись.

Попробую сделать, и воспроизвести ошибку, но не сегодня.
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38593710
Gijad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не получается сделать repro в чистом виде, не прикручивая к нему дополнительных библиотек.

Продолжая исследовать проблему обнаружил (код собирался с оптимизацией O2):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
for (vector<string>::iterator it = tools.begin(); it != tools.end(); ++it){
  cout << "*(it1) = " << *(it) << endl;
}

for (vector<string>::iterator it = tools.begin(); it != tools.end(); ++it){
  stmt_insert -> setString(1, (*(it)).c_str());
  stmt_insert -> executeUpdate();
  stmt->execute(("DROP TABLE IF EXISTS " + config["scheme"] + ".`change_ask_" + *(it) + "`").c_str());
  stmt->execute(("CREATE TABLE " + config["scheme"] + ".`change_ask_" + *(it) + "` (`date` INT(10),`name_id`  INT(4),`value` DECIMAL (15,10),`value2` DECIMAL (15,10)) ENGINE = MYISAM").c_str());
  stmt->execute(("DROP TABLE IF EXISTS " + config["scheme"] + ".`target_" + *(it) + "`").c_str());
  stmt->execute(("CREATE TABLE " + config["scheme"] + ".`target_" + *(it) + "` (`date` INT(10),`name_id`  INT(4),`value` DECIMAL (15,10),`value2` DECIMAL (15,10)) ENGINE = MYISAM").c_str());
}

for (vector<string>::iterator it = tools.begin(); it != tools.end(); ++it){
  cout << "*(it2) = " << *(it) << endl;
}


Если в конструкции закоментировать хотя бы одну строку или 2 сразу ( stmt->execute(("CREATE TABLE " ), то ошибки не происходит.
Если во втором цикле не закомментировать хотя бы одной из этих строк данные пропадают. Если закомментировать все строки тоже все норм. Просто нельзя закомментировать DROP TABLE чтобы не получить ошибку БД.
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38593819
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gijad,

Если бы это было у меня в проекта - я бы подумал что поломал память где то.
Например, вышел за пределы массива(или строки). Способов это сделать много, поэтому тут уже надо смотреть детали.
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38593828
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gijad,

stmt->execute

Это из какой библиотеки?
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38593834
Gijad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivGijad,

stmt->execute

Это из какой библиотеки?
Код: plaintext
1.
2.
3.
4.
5.
6.
#include <mysql_connection.h>
#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
#include <cppconn/prepared_statement.h>



mysqlcppconn.dll
libmysql.dll

ссылка на пример из документации
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38593835
Gijad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_kGijad,

Если бы это было у меня в проекта - я бы подумал что поломал память где то.
Например, вышел за пределы массива(или строки). Способов это сделать много, поэтому тут уже надо смотреть детали.
Поломанная память не должна зависеть от оптимизации, если она поломана, то поломана. А тут наблюдается эта зависимость.
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38593837
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GijadПоломанная память не должна зависеть от оптимизации, если она поломана, то поломана. А тут наблюдается эта зависимость.

Ха, ещё как она зависит!
При выключенной оптимизации, да ещё в дебаг режиме, очень часто поломки памяти не видны.
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38593838
Gijad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivХа, ещё как она зависит!
При выключенной оптимизации, да ещё в дебаг режиме, очень часто поломки памяти не видны.
Я изучал проблему релизов . И когда вылезла эта, я ожидал подобного.
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38593842
Gijad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Видимо, все-таки ломается память, как именно х.з. Есть ли какие-нибудь инструменты облегчающие поиск ошибки?
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38593860
Gijad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivмогло бы быть так:

Код: plaintext
1.
const vector<string> &tools = a.gettools(files);



это возможно съэкономило бы одно лишнее копирование вектора.
Сейчас специально проверил:
Код: plaintext
1.
vector<string> tools = a.gettools(files);


вывел на печать &tools в функции и &tools в теле программы, адреса полностью совпали. Никакого лишнего копирования не произошло.
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38593889
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GijadВидимо, все-таки ломается память, как именно х.з. Есть ли какие-нибудь инструменты облегчающие поиск ошибки?

В винде ?

Там были вроде какие-то режимы сборки специальные...
Надо читать, про последние версии VC я не очень в курсе.
Я знаю, что там что-то продвинули в плане отладки, но помню только про STL (безопасные итераторы).

Про линукс -- valgrind.
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38593891
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GijadMasterZivмогло бы быть так:

Код: plaintext
1.
const vector<string> &tools = a.gettools(files);



это возможно съэкономило бы одно лишнее копирование вектора.
Сейчас специально проверил:
Код: plaintext
1.
vector<string> tools = a.gettools(files);


вывел на печать &tools в функции и &tools в теле программы, адреса полностью совпали. Никакого лишнего копирования не произошло.

Ты слово "возможно" заметил ?
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38593893
Gijad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivТы слово "возможно" заметил ?
Заметил, поэтому и решил проверить, чтобы закрыть этот вопрос для себя. Винда.
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38593894
Gijad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дебаггер в VS какой-то странный, когда код собран с O2 он игнорирует большую часть имеющихся (инициализированных) переменных. Без оптимизации вроде норм, хоть вообще её отключай.
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38593900
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GijadДебаггер в VS какой-то странный, когда код собран с O2 он игнорирует большую часть имеющихся (инициализированных) переменных. Без оптимизации вроде норм, хоть вообще её отключай.

А как ты думаешь делается оптимизация ?
Выкидываются лишние переменные, в том числе.

Правда, это можно наверняка запретить.
Но это надо читать документацию.
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38593902
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GijadЕсть ли какие-нибудь инструменты облегчающие поиск ошибки?
Большую часть ошибок способна ловить сама отладочная RTL, нужно только указать её
использование при сборке. На остальное есть, например, drMemory.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38593903
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gijad,

На самом деле я даже и не знаю, чем ловить порчу памяти, в смысле, тул какой использовать.
Такие ошибки на самом деле достаточно редки.
Там были какие-то сторонние библиотеки, но они все за денюжку...

Как самый простой вариант, можно просто пройти в отладчике по всему этому коду, проверяя тщательно
все переменные после каждой модификации, а особенно -- этот вектор tools.
Там кода в общем немного.

Как более продвинутый способ -- идти не по шагам, а поставить break-и на изменение памяти этого vector-а.
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38593904
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GijadНе получается сделать repro в чистом виде, не прикручивая к нему дополнительных библиотек.

Продолжая исследовать проблему обнаружил (код собирался с оптимизацией O2):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
for (vector<string>::iterator it = tools.begin(); it != tools.end(); ++it){
  cout << "*(it1) = " << *(it) << endl;
}

for (vector<string>::iterator it = tools.begin(); it != tools.end(); ++it){
  stmt_insert -> setString(1, (*(it)).c_str());
  stmt_insert -> executeUpdate();
  stmt->execute(("DROP TABLE IF EXISTS " + config["scheme"] + ".`change_ask_" + *(it) + "`").c_str());
  stmt->execute(("CREATE TABLE " + config["scheme"] + ".`change_ask_" + *(it) + "` (`date` INT(10),`name_id`  INT(4),`value` DECIMAL (15,10),`value2` DECIMAL (15,10)) ENGINE = MYISAM").c_str());
  stmt->execute(("DROP TABLE IF EXISTS " + config["scheme"] + ".`target_" + *(it) + "`").c_str());
  stmt->execute(("CREATE TABLE " + config["scheme"] + ".`target_" + *(it) + "` (`date` INT(10),`name_id`  INT(4),`value` DECIMAL (15,10),`value2` DECIMAL (15,10)) ENGINE = MYISAM").c_str());
}

for (vector<string>::iterator it = tools.begin(); it != tools.end(); ++it){
  cout << "*(it2) = " << *(it) << endl;
}


Если в конструкции закоментировать хотя бы одну строку или 2 сразу ( stmt->execute(("CREATE TABLE " ), то ошибки не происходит.
Если во втором цикле не закомментировать хотя бы одной из этих строк данные пропадают. Если закомментировать все строки тоже все норм. Просто нельзя закомментировать DROP TABLE чтобы не получить ошибку БД.


А если тут заменить итераторы на const_iterator ?
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38593910
Gijad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivА если тут заменить итераторы на const_iterator ?
Если закомментировать хотя бы последнюю строчку все работает.
Код: plaintext
1.
//stmt->execute(("CREATE TABLE " + config["scheme"] + ".`target_" + *(it) + "` (`date` INT(10),`name_id`  INT(4),`value` DECIMAL (15,10),`value2` DECIMAL (15,10)) ENGINE = MYISAM").c_str());


Иначе данные пропадают.
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38593914
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давай разберём подробнее этот кусок:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
for (vector<string>::iterator it = tools.begin(); it != tools.end(); ++it){
  stmt_insert -> setString(1, (*(it)).c_str());
  stmt_insert -> executeUpdate();
  stmt->execute(("DROP TABLE IF EXISTS " + config["scheme"] + ".`change_ask_" + *(it) + "`").c_str());
  stmt->execute(("CREATE TABLE " + config["scheme"] + ".`change_ask_" + *(it) + "` (`date` INT(10),`name_id`  INT(4),`value` DECIMAL (15,10),`value2` DECIMAL (15,10)) ENGINE = MYISAM").c_str());
  stmt->execute(("DROP TABLE IF EXISTS " + config["scheme"] + ".`target_" + *(it) + "`").c_str());
  stmt->execute(("CREATE TABLE " + config["scheme"] + ".`target_" + *(it) + "` (`date` INT(10),`name_id`  INT(4),`value` DECIMAL (15,10),`value2` DECIMAL (15,10)) ENGINE = MYISAM").c_str());
}




Код: plaintext
1.
stmt_insert -> setString(1, (*(it)).c_str());


можно делать проще:
Код: plaintext
1.
stmt_insert -> setString( 1, it->c_str() );



Не правда ли, выглядит элегантнее ?

Код: plaintext
1.
2.
  stmt_insert -> setString(1, (*(it)).c_str());
  stmt_insert -> executeUpdate();



кажется слабо относится ко всему остальному шабашу, может можно убрать эти две строки ?
Будет воспроизводится ?
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38593916
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GijadMasterZivА если тут заменить итераторы на const_iterator ?
Если закомментировать хотя бы последнюю строчку все работает.
Код: plaintext
1.
//stmt->execute(("CREATE TABLE " + config["scheme"] + ".`target_" + *(it) + "` (`date` INT(10),`name_id`  INT(4),`value` DECIMAL (15,10),`value2` DECIMAL (15,10)) ENGINE = MYISAM").c_str());


Иначе данные пропадают.

Да там везде не требуется запись в этот итератор, так что он может быть const.
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38593927
Gijad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivможно делать проще:
Код: plaintext
1.
stmt_insert -> setString( 1, it->c_str() );


Не правда ли, выглядит элегантнее ?

Да, спасибо.

Иду по шагам по коду, последняя строчка не комментирована, слежу в дебаггере за состоянием tools
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
for (vector<string>::iterator it = tools.begin(); it != tools.end(); ++it){
->  stmt_insert -> setString(1, (*(it)).c_str()); //все норм tools.size = 35;
->  stmt_insert -> executeUpdate(); //проблема!  tools.size = 1550831;
  stmt->execute(("DROP TABLE IF EXISTS " + config["scheme"] + ".`change_ask_" + *(it) + "`").c_str());
  stmt->execute(("CREATE TABLE " + config["scheme"] + ".`change_ask_" + *(it) + "` (`date` INT(10),`name_id`  INT(4),`value` DECIMAL (15,10),`value2` DECIMAL (15,10)) ENGINE = MYISAM").c_str());
  stmt->execute(("DROP TABLE IF EXISTS " + config["scheme"] + ".`target_" + *(it) + "`").c_str());
  stmt->execute(("CREATE TABLE " + config["scheme"] + ".`target_" + *(it) + "` (`date` INT(10),`name_id`  INT(4),`value` DECIMAL (15,10),`value2` DECIMAL (15,10)) ENGINE = MYISAM").c_str());
}



Если закомментировать
Код: plaintext
1.
//stmt->execute(("CREATE TABLE " + config["scheme"] + ".`target_" + *(it) + "` (`date` INT(10),`name_id`  INT(4),`value` DECIMAL (15,10),`value2` DECIMAL (15,10)) ENGINE = MYISAM").c_str());


то ошибок нет, 3-й цикл нормально завершается
Код: plaintext
1.
2.
3.
for (vector<string>::const_iterator it = tools.begin(); it != tools.end(); ++it){
  cout << "*(it2) = " << *(it) << endl;
}


Я, конечно, попробую убрать
Код: plaintext
1.
2.
  stmt_insert -> setString(1, (*(it)).c_str());
  stmt_insert -> executeUpdate();


но тогда не будет разницы с закомментированной последней строкой.
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38593946
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gijad,

Так если уже после

Код: plaintext
1.
 stmt_insert -> executeUpdate(); //проблема!  tools.size = 1550831;



tools.size = 1550831;
, то уже тут и проблема, всё остальное ненужно.
Другой вопрос -- как теперь эту проблему обнаруживать.
Ну, вот можно по tools.size <> 35 или сколько у тебя там...


значит этот executeUpdate() уже гробит всю память в хипе.


И кстати я могу даже предположить источник проблемы -- код-то вряд ли с ошибками, уж заметили бы
такую явную фигню.

А вот то, что ты мог собрать эту библиотеку и своё приложение с разными рантаймами ( статическим и с .DLL ) -- это никто кроме тебя не проверит. Проверь. Это достаточно общее место, потому что порядка 50% программистов на С это не понимают.
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38593957
Gijad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,
Спасибо, проверю. Хотя бы заново пересобиру.
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38593988
Gijad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,
Пересбор библиотеки проблему устранил. Изначально использовалась библиотека, скаченная с mysql.com. Спасибо.
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38594060
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gijad,

Так собрана то она собрана, надо ж еще и твой проект собрать, а тут ты должен знать, для какой сборки твоя библиотека была собрана.
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38594203
Gijad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivGijad,
Так собрана то она собрана, надо ж еще и твой проект собрать, а тут ты должен знать, для какой сборки твоя библиотека была собрана.
Так я собирал и всё работало, пока оптимизацию не включил, а если бы во втором цикле было бы на 1 строчку меньше, глядишь проблема никогда бы и не всплыла.
...
Рейтинг: 0 / 0
Пропажа данных из vector<string>
    #38594268
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gijad,

Вот именно "не всплыла", но это не значит, что проблемы не было. Так что тебе еще повезло, что она обнаружила себя вовремя.
...
Рейтинг: 0 / 0
35 сообщений из 35, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Пропажа данных из vector<string>
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]