| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > cout и LeaveCriticalSection |
| Автор: T0ohtik 8.5.2008, 22:12 | ||
| Привет! Я пытаюсь реализовать Список на С++. Столкнулся с такой проблемой. После того как я добавил в список 4 элемента, я пытаюсь вывести их на экран и тут программа вываливается. В режиме отладки элементы в массив занеслись корректно. В выводе ничего хитрого нет:
вывалиавется на строке cout<<nValue<<"\n";. Причем не зависимо от того выводить из перемееной или статически заданого значения. Ну и самое для меня не понятное - это то, что сбой происходит в файле mlock.h в функции LeaveCriticalSection. В следствии чего это может происходить? |
| Автор: NiJazz 8.5.2008, 22:20 |
| Не проще ль использовать std::list? |
| Автор: Rififi 8.5.2008, 22:25 |
| cout без причины не валится. скорее всего программа уже порушена до начала do/while |
| Автор: T0ohtik 8.5.2008, 22:26 |
| Проще то проще Как найти это место. Я просто даже и не знаю где и скать. Массив вроде заполняется правильно. Та и строк там буквально 10 - 15 |
| Автор: Lazin 8.5.2008, 22:27 |
| LeaveCriticalSection тут не причем, это winapi функция, использующаяся в многопоточных программах *применяет телепатичесские способности* скорее всего у тебя происходит разименование непроинициализированного или нулевого указателя |
| Автор: T0ohtik 8.5.2008, 22:38 |
| Вот выкладываю проект. Посмотрите пожалуйста. |
| Автор: T0ohtik 9.5.2008, 17:56 | ||
Я так подозреваю, что ошибка кроется в выделении памяти при методе Push
Можно ли так изменять размеры массива? Как можно реализовать аналог Cи функции realloc, кроме как memcpy? |
| Автор: vinter 10.5.2008, 00:20 |
| LIST *list = new(list) LIST[nCountElements]; ; |
| Автор: T0ohtik 10.5.2008, 10:29 |
| Не я думаю мне надо что-то примерное такое. В list у меня хранится массив структур. При добавлении еще одной, мы выделяем размер на 1 элемент больше предыдущего, и этот выделенный кусок памяти инициализируем уже существующим list. а таким образом мы просто выделим новый кусок памяти и затрем им старый. Я ж говорю надо что-то типа realloc только на. С++ |
| Автор: T0ohtik 10.5.2008, 17:40 |
| Ну если бы мой код был нормальный, я, наверное сюда не писал бы А по какому принципу организован std::list, я думаю, новая память выделяется по мере добавления, а не сразу большим куском и адрес следующего элемента указывается в специальной переменной (т.е. элементы списка и так связаны указателями)? |
| Автор: vinter 10.5.2008, 18:09 | ||
отдельный элемент - отдельная область памяти
ты по моему путаешь списки с векторами, это у вектора элементы должны лежать в памяти последовательно, в списке - нет. |
| Автор: T0ohtik 10.5.2008, 18:40 | ||
Списки с векторами я не перепутал, я перепутал логику работы оператора new. Свою ошибку осознал. Про реализацию списка я читал.
Вот, что-то типа того. У меня возни вопрос, а как получит доступ к произвольному члену. Например, в списке 1000 элементов, а надо добраться до 500 элемента, не будешь же писать цикл на 500 повторов. И как будет выглядеть деструктор для такого списка? |
| Автор: vinter 10.5.2008, 19:34 | ||
именно так и будешь, итераторы stl::ist как раз двуноправленные. |
| Автор: T0ohtik 10.5.2008, 19:54 |
| А как же будет выглядеть деструктор? delete []list, здесь же не подходит. Тоже в цикле удалять? |
| Автор: vinter 10.5.2008, 20:01 |
судя по всему да, другого выхода я тут не вижу. |
| Автор: T0ohtik 10.5.2008, 20:30 |
| Хорошо, Спасибо. И последний вопрос. А как реализовать realloc. Только в копирование в цикле или memcpy или есть более красивый способ? |