Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Пропажа данных из vector<string> / 25 сообщений из 35, страница 1 из 2
21.03.2014, 11:03
    #38592673
Gijad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропажа данных из vector<string>
Столкнулся с проблемой, подскажите куда смотреть.
В работе использую 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
21.03.2014, 12:53
    #38592828
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропажа данных из vector<string>
Gijad,

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


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

const - объект tools

и/или

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

Кстати, тут :

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



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

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



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

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

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

Попробую сделать, и воспроизвести ошибку, но не сегодня.
...
Рейтинг: 0 / 0
22.03.2014, 20:04
    #38593710
Gijad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропажа данных из vector<string>
Не получается сделать 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
23.03.2014, 05:31
    #38593819
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропажа данных из vector<string>
Gijad,

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

stmt->execute

Это из какой библиотеки?
...
Рейтинг: 0 / 0
23.03.2014, 09:42
    #38593834
Gijad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропажа данных из vector<string>
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
23.03.2014, 09:44
    #38593835
Gijad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропажа данных из vector<string>
alex_kGijad,

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

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

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



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


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

В винде ?

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

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

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



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


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

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

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

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

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

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

Как более продвинутый способ -- идти не по шагам, а поставить break-и на изменение памяти этого vector-а.
...
Рейтинг: 0 / 0
23.03.2014, 13:26
    #38593904
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропажа данных из vector<string>
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
Форумы / C++ [игнор отключен] [закрыт для гостей] / Пропажа данных из vector<string> / 25 сообщений из 35, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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