Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/22: Рейтинг темы: голосов - 22, средняя оценка - 4.64
19 / 20 / 0
Регистрация: 09.01.2013
Сообщений: 168
1

Выделение памяти под массив объектов без вызова конструктора

21.06.2013, 21:32. Показов 4543. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер.
Насколько я знаю, при выделении памяти под массив объектов, для каждого из них вызывается конструктор.
Можно ли сперва выделить память, а затем инициализировать объекты?
Нашел следующий код, но не совсем понимаю, как он вообще работает
C++
1
2
STACK* s = (STACK*)operator new (sizeof STACK* MAX); //выделяем память под массив объектов размером MAX
new (&s [num]) STACK (InitNumber, InitName); //вызываем конструктор для конкретного объекта
Поясните, пожалуйста
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.06.2013, 21:32
Ответы с готовыми решениями:

Выделение памяти под массив объектов
У меня есть класс Shape. Требуется выделить память под массив этих объектов. К примеру: *Shape...

Стандартные типы объектов в C++ и выделение памяти под них
Всем здрасти :) У меня вот такой вопрос , а точнее даже вопросы ... допустим есть код : char...

Выделение памяти с помощью new под объекты без вызова их конструкторов
здравствуйте, корректен ли следующий код: myClass* pttr = static_cast<myClass*>(::operator new(5 *...

Выделение памяти под массив
в массиве данных хранять в последовательных ячейках памяти В программе, выделенна память под...

11
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
21.06.2013, 21:35 2
Цитата Сообщение от Ryabchik Посмотреть сообщение
Насколько я знаю, при выделении памяти под массив объектов, для каждого из них вызывается конструктор.
Можно ли сперва выделить память, а затем инициализировать объекты?
да, читайте про placement new.
1
19 / 20 / 0
Регистрация: 09.01.2013
Сообщений: 168
21.06.2013, 21:38  [ТС] 3
Цитата Сообщение от MrGluck Посмотреть сообщение
да, читайте про placement new.
Спасибо,а все таки, что делает этот магический код?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
21.06.2013, 21:40 4
Цитата Сообщение от Ryabchik Посмотреть сообщение
что делает этот магический код?
выделяет память для объектов, а потом размещает объект в выделенной ранее памяти.
1
19 / 20 / 0
Регистрация: 09.01.2013
Сообщений: 168
21.06.2013, 21:42  [ТС] 5
Цитата Сообщение от Croessmah Посмотреть сообщение
выделяет память для объектов, а потом размещает объект в выделенной ранее памяти.
Как то через задницу он это делает))
Всем спасибо, буду терзать placement new))
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
21.06.2013, 21:44 6
Цитата Сообщение от Ryabchik Посмотреть сообщение
Как то через задницу он это делает))
Да? Ну предложите свой вариант, который будет это делать через передницу
1
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
21.06.2013, 21:45 7
Цитата Сообщение от Ryabchik Посмотреть сообщение
Можно ли сперва выделить память, а затем инициализировать объекты?
Цитата Сообщение от Ryabchik Посмотреть сообщение
Насколько я знаю, при выделении памяти под массив объектов, для каждого из них вызывается конструктор.
не совсем
конструктор вызывает new а если выделять malloc то никак конструкторов не будет
А для чего это надо
Цитата Сообщение от Ryabchik Посмотреть сообщение
Спасибо,а все таки, что делает этот магический код?
placement new как раз и делает то что тебе нужно
цитата из вики
Существует особая форма оператора new, называемая Placement new. Данный оператор не выделяет память, а получает своим аргументом адрес на уже выделенную каким-либо образом память (например, на стеке или через malloc). Происходит размещение (инициализация) объекта путем вызова конструктора, и объект создается в памяти по указанному адресу. Часто такой метод применяют, когда у класса нет конструктора по умолчанию и при этом нужно создать массив объектов. Пример вызова выглядит следующим образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class A
{
public:
  A(int x){}
  ~A(){}
};
const int n = 50;
A* placementMemory = static_cast<A*>(operator new[] (n * sizeof(A)));
for (int i = 0; i < n; i++)
{
  new (placementMemory + i) A(rand()); //здесь память для объекта не выделяется, но инициализируется
}
//!!деинициализация памяти
for (int i = 0; i < n; i++)
{
  placementMemory[i].~A();
}
operator delete[] (placementMemory);
Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
выделяет память для объектов,
кто выделяет? placement new?
1
19 / 20 / 0
Регистрация: 09.01.2013
Сообщений: 168
21.06.2013, 21:46  [ТС] 8
Цитата Сообщение от Croessmah Посмотреть сообщение
Да? Ну предложите свой вариант, который будет это делать через передницу
Запишу в список дел на выходные
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
21.06.2013, 21:48 9
Цитата Сообщение от ValeryS Посмотреть сообщение
кто выделяет? placement new?
собственно вот:
C++
1
STACK* s = (STACK*)operator new (sizeof STACK* MAX);
0
19 / 20 / 0
Регистрация: 09.01.2013
Сообщений: 168
21.06.2013, 21:54  [ТС] 10
@ValeryS, спасибо, вроде понял
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
21.06.2013, 21:58 11
Цитата Сообщение от Croessmah Посмотреть сообщение
собственно вот:
так это обныкновенный new который выделяет память для char посему и не зовет конструктор
ты мог с тем же успехом написать
C++
1
STACK* s = (STACK*)malloc(sizeof STACK* MAX);
placement new то будет потом
C++
1
new (s) STACK();
вызов конструктора без выделения памяти
0
Croessmah
21.06.2013, 22:26     Выделение памяти под массив объектов без вызова конструктора
  #12

Не по теме:

классный диалог :mda:

Цитата Сообщение от Ryabchik Посмотреть сообщение
что делает этот магический код?
Цитата Сообщение от Croessmah Посмотреть сообщение
выделяет память для объектов, а потом размещает объект в выделенной ранее памяти.
Цитата Сообщение от ValeryS Посмотреть сообщение
кто выделяет?
Цитата Сообщение от Croessmah Посмотреть сообщение
собственно вот:
Цитата Сообщение от ValeryS Посмотреть сообщение
так это обныкновенный new который выделяет память
что-то вроде этого:
- ты за грибами?
- нет, я за грибами.
- а я думал за грибами

3
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.06.2013, 22:26

Выделение памяти под массив
Требуется выделить память под матрицу. Будет ли следующий код работать корректно? ...

Динамическое выделение памяти под массив
Доброго времени суток. Как реализовать динамическое выделение памяти под массив, к примеру размера...

Выделение памяти под двумерный массив
Доброе время ! Проблема такая : препод задал задачу сортировки массива произвольного типа(char*...

Выделение памяти под массив строк
Вот нерабочий код и сейчас объясню, что пытаюсь сделать fstream f; f.open(&quot;in.txt&quot;, ios::in);...


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

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