Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
1

Нужно ли вызывать деструкторы для объектов помувленного массива?

15.02.2017, 08:13. Показов 1594. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Собственно, сабж.

Будет ли правильным вызывать деструкторы элементов массива, которые были перемещены, или это бесполезная трата времени и массив можно освободить из памяти. Как принято в стандартной библиотеке?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.02.2017, 08:13
Ответы с готовыми решениями:

БД: для уже имеющихся строк нужно вызывать метод Update, для остальных - Insert
Допустим, есть база данных, в которой есть таблица Table1, содержащая поле ID (первичный ключ),...

Удаление объектов(деструкторы)
Можете нормально объяснить как пользоваться деструкторами. Допустим мне нужно удалить созданный...

В каких структурах нужно прописать деструкторы?
Здравствуйте. Вопрос в каких структурах нужно прописать деструкторы. Спасибо. struct A { ...

Нужно ли NEW для объектов окна?
Доброе время суток. Недавно возник такой вопрос. Стоит ли выделять память под объекты с помощью...

12
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
15.02.2017, 08:25 2
А зачем? Деструктор перемещенного объекта сам вызовет деструкторы других объектов при своей смерти.
0
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
15.02.2017, 09:01  [ТС] 3
Дело в том, что объект то как раз не умер. Объект - это контейнер. Он перемещает хранимые объекты в другую область в целях расширения (ака вектор).
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
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
Цитата Сообщение от Mirmik Посмотреть сообщение
Вопрос. Перед освобождением буфера.. Вызывает ли вектор деструкторы теперь уже невалидных объектов в освобождаемом буфере?
Да. Операторы перемещения ничего невалидным не делают, а потому от необходимости вызывать деструкторы не освобождают.
1
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
15.02.2017, 10:28 7
Цитата Сообщение от GbaLog- Посмотреть сообщение
он уже как убитый должен быть.
Поправочка, как пустой, конечно же.
Готовый к новому использованию.

Добавлено через 4 минуты
Цитата Сообщение от Mirmik Посмотреть сообщение
Вызывает ли вектор деструкторы теперь уже невалидных объектов в освобождаемом буфере?
Они сами вызываются после delete old_data;
1.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
struct A
{
    A() { std::cout << "ctor\n"; }
    ~A() { std::cout << "dtor\n"; }
};
 
int main()
{
    A * a = new A;
    delete a;
}
Out:
Код
ctor
dtor
2.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
struct A
{
    A() { std::cout << "ctor\n"; }
    ~A() { std::cout << "dtor\n"; }
};
 
int main()
{
    A * a = new A;
    //delete a;
}
Out:
Код
ctor
1
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
15.02.2017, 10:59 8
Цитата Сообщение от GbaLog- Посмотреть сообщение
Деструктор перемещенного объекта сам вызовет деструкторы других объектов при своей смерти
опустошаемый объект не умирает.
опустошаемые им поля так же не умирают.

Цитата Сообщение от GbaLog- Посмотреть сообщение
После перемещения объект не должен хранить вообще ничего, он уже как убитый должен быть.
нет, по стандарту опустошенный объект находится в состоянии unspecified

это означает:
"не известно точно в каком, но известно точно,
что он полностью валиден, и работоспособен".

Цитата Сообщение от GbaLog- Посмотреть сообщение
Поправочка, как пустой, конечно же.
Готовый к новому использованию.
ну да, вот оно самое.

Mirmik,
это значит, что как минимум,
у него корректно отработает диструктор.

а посетив ему новое состояние,
мы можем продолжать его эксплуатировать так,
словно никакого перемещения никогда и не было.
0
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
15.02.2017, 13:04  [ТС] 9
Они сами вызываются после delete old_data;
Таки если я пишу в стиле stl контейнеров, то конструкторы и деструкторы мне все-таки приходится вызывать самому.
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
15.02.2017, 13:27 10
Цитата Сообщение от Mirmik Посмотреть сообщение
то конструкторы и деструкторы мне все-таки приходится вызывать самому.
Никогда не надо вызывать деструкторы самому! Исключение: placement new. Если вы не пользуете placement new, то после вызова delete для старого буфера деструкторы будут вызваны автоматически.
0
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
15.02.2017, 13:49 11
Цитата Сообщение от GbaLog- Посмотреть сообщение
Исключение: placement new.
Наверное вы имели ввиду, placement new, и если его указатель на объект не используется с delete.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
struct Foo
{
    int n;
    Foo()
    {
        std::cout << "CONSTRUCT";
    }
    ~Foo()
    {
        std::cout << "DESTRUCT";
    }
};
 
int main()
{
    void *ptr = operator new(sizeof(Foo));
    Foo *f = new(ptr)Foo;
    delete f;
}
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
15.02.2017, 13:57 12
Цитата Сообщение от sys_beginner Посмотреть сообщение
Наверное вы имели ввиду, 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.02.2017, 14:17
Помогаю со студенческими работами здесь

Когда нужно вызывать деструктор?
Интересует такой вопрос, если у нас есть класс и функции кнопок, которые используют компонент этого...

Функция создает объекты и указателями на них заполняет массив. При выходе из функции вызываются деструкторы объектов. Как сохранить объекты?
Вопрос прост: как при выходе из функции сохранить объекты, которые были созданы в данной функции...

Нужно ли тут вызывать оператор delete
Всем здрасьте. Тут встал вопрос об операторе delete. struct x { //... }; x* y; y = new x;...

Нужно ли вызывать Dispose() перед закрытием приложения
Всем привет! Есть PictureBox со свойством Image. Насколько я понял, если в программе динамически...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru