techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
|
|
1 | |
Нужно ли вызывать деструкторы для объектов помувленного массива?15.02.2017, 08:13. Показов 1594. Ответов 12
Метки нет (Все метки)
Собственно, сабж.
Будет ли правильным вызывать деструкторы элементов массива, которые были перемещены, или это бесполезная трата времени и массив можно освободить из памяти. Как принято в стандартной библиотеке?
0
|
15.02.2017, 08:13 | |
Ответы с готовыми решениями:
12
БД: для уже имеющихся строк нужно вызывать метод Update, для остальных - Insert Удаление объектов(деструкторы) В каких структурах нужно прописать деструкторы? Нужно ли NEW для объектов окна? |
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
|
|
15.02.2017, 09:01 [ТС] | 3 |
Дело в том, что объект то как раз не умер. Объект - это контейнер. Он перемещает хранимые объекты в другую область в целях расширения (ака вектор).
0
|
Любитель чаепитий
|
|
15.02.2017, 09:15 | 4 |
Не совсем понятно, что значит не умер? После перемещения объект не должен хранить вообще ничего, он уже как убитый должен быть. Контейнер, из которого происходит перемещение, не должен иметь указателя на данные, которыми он раньше владел(если речь идёт о чем-то, похожем на вектор).
0
|
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
|
|
15.02.2017, 09:22 [ТС] | 5 |
Ок. Еще раз постановка вопроса.
Пусть речь идет о векторе. Я хочу разобраться в его механике. Я запросил добавление элемента. Вектор проверил размер буфера и выяснил, что буфер заполнен. Вектор начинает процедуру расширения буфера. Для этого он тягает аллокатор выделить больший буфер и использует алгоритм множественного move для перемещения данных в новую область памяти. После перемещения вектор освобождает область памяти, занимаемую его буфером ранее. Вопрос. Перед освобождением буфера.. Вызывает ли вектор деструкторы теперь уже невалидных объектов в освобождаемом буфере?
0
|
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
15.02.2017, 09:29 | 6 |
Да. Операторы перемещения ничего невалидным не делают, а потому от необходимости вызывать деструкторы не освобождают.
1
|
Любитель чаепитий
|
|||||||||||
15.02.2017, 10:28 | 7 | ||||||||||
Поправочка, как пустой, конечно же.
Готовый к новому использованию. Добавлено через 4 минуты Они сами вызываются после delete old_data; 1.
Код
ctor dtor
Код
ctor
1
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
15.02.2017, 10:59 | 8 |
опустошаемый объект не умирает.
опустошаемые им поля так же не умирают. нет, по стандарту опустошенный объект находится в состоянии unspecified это означает: "не известно точно в каком, но известно точно, что он полностью валиден, и работоспособен". ну да, вот оно самое. Mirmik, это значит, что как минимум, у него корректно отработает диструктор. а посетив ему новое состояние, мы можем продолжать его эксплуатировать так, словно никакого перемещения никогда и не было.
0
|
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
|
|
15.02.2017, 13:04 [ТС] | 9 |
0
|
Любитель чаепитий
|
|
15.02.2017, 13:27 | 10 |
Никогда не надо вызывать деструкторы самому! Исключение:
placement new . Если вы не пользуете placement new , то после вызова delete для старого буфера деструкторы будут вызваны автоматически.
0
|
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
|
||||||
15.02.2017, 13:49 | 11 | |||||
Наверное вы имели ввиду, placement new, и если его указатель на объект не используется с delete.
0
|
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
|
|
15.02.2017, 14:17 [ТС] | 13 |
Когда я говорю самому, я имею ввиду std::allocator::destruct.
std::allocator, насколько я понимаю, хочет, чтобы ручками был вызван std::allocator::destruct. std::allocator::deallocate ведь не вызывает destruct? Добавлено через 7 минут В коде стандартного вектора, как я смотрю, вызывается std::_Destoy. Правда, я почему-то никак не соображу, кто он такой...
0
|
15.02.2017, 14:17 | |
15.02.2017, 14:17 | |
Помогаю со студенческими работами здесь
13
Когда нужно вызывать деструктор? Функция создает объекты и указателями на них заполняет массив. При выходе из функции вызываются деструкторы объектов. Как сохранить объекты? Нужно ли тут вызывать оператор delete Нужно ли вызывать Dispose() перед закрытием приложения Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |