Цитата:
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.