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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Ryabchik
18 / 18 / 1
Регистрация: 09.01.2013
Сообщений: 163
#1

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

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

Добрый вечер.
Насколько я знаю, при выделении памяти под массив объектов, для каждого из них вызывается конструктор.
Можно ли сперва выделить память, а затем инициализировать объекты?
Нашел следующий код, но не совсем понимаю, как он вообще работает
C++
1
2
STACK* s = (STACK*)operator new (sizeof STACK* MAX); //выделяем память под массив объектов размером MAX
new (&s [num]) STACK (InitNumber, InitName); //вызываем конструктор для конкретного объекта
Поясните, пожалуйста
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.06.2013, 21:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Выделение памяти под массив объектов без вызова конструктора (C++):

Выделение памяти под массив объектов - C++
У меня есть класс Shape. Требуется выделить память под массив этих объектов. К примеру: *Shape **shapes; *shapes = new Shape; После...

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

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

Выделение памяти под массив - C++
Требуется выделить память под матрицу. Будет ли следующий код работать корректно? //глобальная область int x_size = 3; ...

Выделение памяти под двумерный массив С++ - C++
Гуру С++, подскажите новичку, как обратиться к элементу при следующем выделении памяти? 1)double **matr = new double * 2)double *matr...

Выделение памяти под массив структур - C++
Возникла проблема в том что не могу никак эфективно реализовать выделение памяти под массив структур, более того: единожды выделив память я...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MrGluck
Модератор
Эксперт CЭксперт С++
7239 / 4407 / 642
Регистрация: 29.11.2010
Сообщений: 11,927
21.06.2013, 21:35 #2
Цитата Сообщение от Ryabchik Посмотреть сообщение
Насколько я знаю, при выделении памяти под массив объектов, для каждого из них вызывается конструктор.
Можно ли сперва выделить память, а затем инициализировать объекты?
да, читайте про placement new.
1
Ryabchik
18 / 18 / 1
Регистрация: 09.01.2013
Сообщений: 163
21.06.2013, 21:38  [ТС] #3
Цитата Сообщение от MrGluck Посмотреть сообщение
да, читайте про placement new.
Спасибо,а все таки, что делает этот магический код?
0
Croessmah
Эксперт CЭксперт С++
13219 / 7491 / 844
Регистрация: 27.09.2012
Сообщений: 18,411
Записей в блоге: 3
Завершенные тесты: 1
21.06.2013, 21:40 #4
Цитата Сообщение от Ryabchik Посмотреть сообщение
что делает этот магический код?
выделяет память для объектов, а потом размещает объект в выделенной ранее памяти.
1
Ryabchik
18 / 18 / 1
Регистрация: 09.01.2013
Сообщений: 163
21.06.2013, 21:42  [ТС] #5
Цитата Сообщение от Croessmah Посмотреть сообщение
выделяет память для объектов, а потом размещает объект в выделенной ранее памяти.
Как то через задницу он это делает))
Всем спасибо, буду терзать placement new))
0
Croessmah
Эксперт CЭксперт С++
13219 / 7491 / 844
Регистрация: 27.09.2012
Сообщений: 18,411
Записей в блоге: 3
Завершенные тесты: 1
21.06.2013, 21:44 #6
Цитата Сообщение от Ryabchik Посмотреть сообщение
Как то через задницу он это делает))
Да? Ну предложите свой вариант, который будет это делать через передницу
1
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
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
Ryabchik
18 / 18 / 1
Регистрация: 09.01.2013
Сообщений: 163
21.06.2013, 21:46  [ТС] #8
Цитата Сообщение от Croessmah Посмотреть сообщение
Да? Ну предложите свой вариант, который будет это делать через передницу
Запишу в список дел на выходные
0
Croessmah
Эксперт CЭксперт С++
13219 / 7491 / 844
Регистрация: 27.09.2012
Сообщений: 18,411
Записей в блоге: 3
Завершенные тесты: 1
21.06.2013, 21:48 #9
Цитата Сообщение от ValeryS Посмотреть сообщение
кто выделяет? placement new?
собственно вот:
C++
1
STACK* s = (STACK*)operator new (sizeof STACK* MAX);
0
Ryabchik
18 / 18 / 1
Регистрация: 09.01.2013
Сообщений: 163
21.06.2013, 21:54  [ТС] #10
@ValeryS, спасибо, вроде понял
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
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

Не по теме:

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

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

3
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.06.2013, 22:26
Привет! Вот еще темы с ответами:

Выделение памяти под шаблонный массив - C++
template &lt;class T&gt; T* arrray &lt;T&gt;::create (unsigned size) { //..... T* templateBuf = new T ; for (unsigned index = 0;...

Выделение памяти под массив структур - C++
Добрый день. Подскажите в чём ошибка. #pragma hdrstop #pragma argsused #include &lt;stdio.h&gt; #include &lt;iostream&gt; struct...

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.06.2013, 22:26
Ответ Создать тему
Опции темы

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