Тема: std::vector
Показать сообщение отдельно
Старый 30.01.2006, 22:54     # 9
alexey_ma
Member
 
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245

alexey_ma Нимб уже пробиваетсяalexey_ma Нимб уже пробивается
Цитата:
Crazy_kettle:
Если запретить, то имхо в вектор ничего нельзя будет добавить . Кстати, Имхо вызов конструктора не вредит. Другое дело деструктор, но его я убрал . Память освобождается при очистке вектора.
Ну вы, блин даете. Это совсем плохо. Поробуйте одну и ту-же структуру дважды в вектор добавить. A? Как тогда будет память освобождаться?

Цитата:
Crazy_kettle:
Да при окончании программы вызывается деструктор для строки. Но т.к. s.str==NULL, то ф-ция free(s.str) НИЧЕГО не делает, а, значит, можно считать, что для структуры s деструктор вовсе отсутствует .
Не предусмотрел я то, что при реализации vector:ush_back может создаваться временный объект (что вы категорически отрицаете) и для него вызываться деструктор, который всё портит. Я не виню за это программистов Microsoft, это их дело как писать свои процедуры.
Цитата:
Да елы-палы. Нет там никакого временного объекта. Я же привел прототип push_back. push_back В ПАРАМЕТРЕ ПОЛУЧАЕТ КОСТАНТНУЮ ССЫЛКУ(РЕФЕРЕНС)
Код:
void push_back(
   const Type& _Val
);
Уважаемый, вы в курсе что такое ссылка он же референс?
Eще раз : Cоздается два объекта, один обьявленная вами локальная структура и ее копия в векторе. Оба этих объекта из-за отсутствия конструктора копирования имеют указатель char* str содержащий один и тот же адрес (это легко проверить в дебагире). Локальная структура уничтожается когда она выходит из скопа. Для неё вызывается деструктор в котором освобождается указатель str. Копия этой структуры уничтожается тогда когда вектор выходит из скопа. Вектор при удалении вызывает деструкторы для хранящихся в нём объектов. Следовательно деструктор копии пытается тоже освободить указатель str. Поскольку адрес хранящийся в этом указателе уже освобожден после вызова деструктора локальной структуры то происходит нарушение защиты памяти, в просторечии креш.
Если вы мне не верите то спросите любого програмиста хотя бы немного разбирающегося в С++ , он вам скажет то-же самое. А еще лучше, до того как начинаете писать код почитайте соответствующую литературу и ознакомтесь, наконец, с документацией на STL.
__________________
Best Regards

Последний раз редактировалось alexey_ma; 30.01.2006 в 23:07.
alexey_ma вне форума