powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Пропажа данных из vector<string>
25 сообщений из 35, страница 1 из 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
25 сообщений из 35, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Пропажа данных из vector<string>
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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