Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
 
tapochka
38 / 38 / 8
Регистрация: 25.04.2014
Сообщений: 483
#1

Выделение памяти с помощью new под объекты без вызова их конструкторов - C++

13.07.2015, 01:33. Просмотров 960. Ответов 23
Метки нет (Все метки)

здравствуйте, корректен ли следующий код:
C++
1
2
3
4
5
6
7
8
9
10
11
myClass* pttr = static_cast<myClass*>(::operator new[](5 * sizeof(myClass)));
for (int i = 0; i < 5; i++){
      new(pttr+i) myClass();
}
 
::operator new[](2*sizeof(myClass),pttr + 5);
 
for (int i = 0; i < 5; i++){
     (pttr + i)->~myClass();
}
::operator delete[](pttr);
т.е. в конце освобождается вся память или только на 5 элементов?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.07.2015, 01:33     Выделение памяти с помощью new под объекты без вызова их конструкторов
Посмотрите здесь:

C++ Выделение памяти под переменную
C++ Порядок вызова конструкторов
Выделение памяти под массив объектов без вызова конструктора C++
C++ Выделение памяти под структуру
Выделение памяти под массивы C++
C++ Выделение статической памяти, не используя статические объекты
Выделение памяти под структуру C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
tapochka
38 / 38 / 8
Регистрация: 25.04.2014
Сообщений: 483
13.07.2015, 05:23  [ТС]     Выделение памяти с помощью new под объекты без вызова их конструкторов #21
не подскажете почему если написать:
C++
1
2
3
4
5
6
7
8
9
10
11
class myClass {
public:
    myClass() { cout << "myClass construct" << endl; }
    myClass(const myClass& base) { cout << "myClass copy construct" << endl; }
    myClass(myClass&& base) { cout << "myClass move construct" << endl; }
    ~myClass() { cout << "myClass destruct" << endl; }
    void prints(int a) { cout << a << endl; }
};
 
std::vector<myClass> vector(5);
vector.reserve(10);
то выведет следующее:
myClass construct
myClass construct
myClass construct
myClass construct
myClass construct
myClass move construct
myClass move construct
myClass move construct
myClass move construct
myClass move construct

почему 5 элементов откуда-то куда-то переместились когда мы даже не инициализировали 5 последних из них?
Renji
1753 / 1180 / 274
Регистрация: 05.06.2014
Сообщений: 3,398
13.07.2015, 05:34     Выделение памяти с помощью new под объекты без вызова их конструкторов #22
Цитата Сообщение от tapochka Посмотреть сообщение
почему 5 элементов откуда-то куда-то переместились когда мы даже не инициализировали 5 последних из них?
В третий раз повторяю, reserve создает новый массив и переносит в него содержимое старого. Вот при этом переносе элементы и переместились. Потому что вектор очень любит вызывать перемещающий конструктор, вместо копирующего.
tapochka
38 / 38 / 8
Регистрация: 25.04.2014
Сообщений: 483
13.07.2015, 05:40  [ТС]     Выделение памяти с помощью new под объекты без вызова их конструкторов #23
Цитата Сообщение от Renji Посмотреть сообщение
Вот при этом переносе элементы и переместились
походу я базовых вещей не понимаю... но если они переместились, то по идее должны же только move-конструкторы сработать, откуда тогда обычные конструкторы взялись?)

вроде понял наконец-то...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2015, 05:41     Выделение памяти с помощью new под объекты без вызова их конструкторов
Еще ссылки по теме:

Выделение памяти под матрицу C++
C++ Выделение памяти под матрицу
Выделение памяти под указатель C++
Перераспределение памяти с new под объекты C++
C++ Порядок вызова конструкторов

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

Или воспользуйтесь поиском по форуму:
Renji
1753 / 1180 / 274
Регистрация: 05.06.2014
Сообщений: 3,398
13.07.2015, 05:41     Выделение памяти с помощью new под объекты без вызова их конструкторов #24
Оттуда что vector(5) инициализирует пять элементов, вызывая их конструкторы.
Yandex
Объявления
13.07.2015, 05:41     Выделение памяти с помощью new под объекты без вызова их конструкторов
Ответ Создать тему
Опции темы

Текущее время: 14:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru