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

C++

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

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

13.07.2015, 01:33. Просмотров 1096. Ответов 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 элементов?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.07.2015, 01:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Выделение памяти с помощью new под объекты без вызова их конструкторов (C++):

Динамическое выделение памяти под строку - C++ Builder
Проблема в том, что при выделении памяти под строку temp-&gt;data.other, происходит изменение выделенной динамически строки temp-&gt;data.main ...

Выделение памяти (CodeGear RAD Studio 2009 - C++ builder). Выделение памяти - консоль vs SDIApp - C++ Builder
Есть определенный класс - длинная арифметика. Не идеальный - хранение данных исполнено в виде динамического массива типа short int, каждая...

Выделение памяти под типы данных - нужен совет! - C++ Builder
Подскажите, пожалуйста: Внутри функции main() завожу подряд несколько переменных (new не использую, поэтому, как я понимаю переменные...

Матрица и выделение динамической памяти под нее - Visual C++
Всем привет. Условие программы такое: По заданной матрице составить вектор, элементы которого равны суммам элементов соответствующей...

Выделение памяти под массив объектов без вызова конструктора - C++
Добрый вечер. Насколько я знаю, при выделении памяти под массив объектов, для каждого из них вызывается конструктор. Можно ли сперва...

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

23
Renji
1927 / 1325 / 299
Регистрация: 05.06.2014
Сообщений: 3,830
13.07.2015, 05:02 #16
Цитата Сообщение от tapochka Посмотреть сообщение
мне не понятно почему это работает:
И что непонятно? Выделен (capacity) массив на тысячу элементов, из них использовано (size) пять. Остальные про запас лежат.
0
tapochka
40 / 40 / 8
Регистрация: 25.04.2014
Сообщений: 499
13.07.2015, 05:07  [ТС] #17
Цитата Сообщение от Renji Посмотреть сообщение
Выделен (capacity) массив на тысячу элементов, из них использовано (size) пять. Остальные про запас лежат.
вы же написали, что изменить размер выделенного блока нельзя... однако у нас сначала был блок на 5, потом блок на 1000...
неужели вектор через realloc реализован?
0
Renji
1927 / 1325 / 299
Регистрация: 05.06.2014
Сообщений: 3,830
13.07.2015, 05:10 #18
Цитата Сообщение от tapochka Посмотреть сообщение
вы же написали, что изменить размер выделенного блока нельзя... однако у нас сначала был блок на 5, потом блок на 1000
Я же сказал "приходится создать новый массив и скопировать в него старый".
C++
1
2
3
4
5
6
7
int*ptr=new int[5];
for(int i=0;i<5;++i)
    ptr[i]=i;
int*temp=new int[7];
copy(ptr,ptr+5,temp);
delete[]ptr;
ptr=temp;
1
tapochka
40 / 40 / 8
Регистрация: 25.04.2014
Сообщений: 499
13.07.2015, 05:12  [ТС] #19
Цитата Сообщение от Renji Посмотреть сообщение
Я же сказал "приходится создать новый массив и скопировать в него старый".
я думал так лишь push_back реализован, а тут оказывается и reserve тоже
0
Renji
1927 / 1325 / 299
Регистрация: 05.06.2014
Сообщений: 3,830
13.07.2015, 05:15 #20
Цитата Сообщение от tapochka Посмотреть сообщение
я думал так лишь push_back реализован, а тут оказывается и reserve тоже
Ну так повторяю, вектор выделяет память через функции предоставленные аллокатором. А там просто не предусмотрели аналога resize. То есть, если даже менеджер управления памятью resize поддерживает, вектор о его существовании ничего не знает и знать не может.
0
tapochka
40 / 40 / 8
Регистрация: 25.04.2014
Сообщений: 499
13.07.2015, 05:23  [ТС] #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 последних из них?
0
Renji
1927 / 1325 / 299
Регистрация: 05.06.2014
Сообщений: 3,830
13.07.2015, 05:34 #22
Цитата Сообщение от tapochka Посмотреть сообщение
почему 5 элементов откуда-то куда-то переместились когда мы даже не инициализировали 5 последних из них?
В третий раз повторяю, reserve создает новый массив и переносит в него содержимое старого. Вот при этом переносе элементы и переместились. Потому что вектор очень любит вызывать перемещающий конструктор, вместо копирующего.
0
tapochka
40 / 40 / 8
Регистрация: 25.04.2014
Сообщений: 499
13.07.2015, 05:40  [ТС] #23
Цитата Сообщение от Renji Посмотреть сообщение
Вот при этом переносе элементы и переместились
походу я базовых вещей не понимаю... но если они переместились, то по идее должны же только move-конструкторы сработать, откуда тогда обычные конструкторы взялись?)

вроде понял наконец-то...
0
Renji
1927 / 1325 / 299
Регистрация: 05.06.2014
Сообщений: 3,830
13.07.2015, 05:41 #24
Оттуда что vector(5) инициализирует пять элементов, вызывая их конструкторы.
1
13.07.2015, 05:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2015, 05:41
Привет! Вот еще темы с ответами:

Выделение статической памяти, не используя статические объекты - C++
Здравствуйте! Как известно, когда мы объявляем статическую переменную, то компилятор выделяет ей место с самого начала, т. е....

Перераспределение памяти с new под объекты - C++
есть класс #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; class tel_book { private: char *FIO; int count...

Порядок вызова конструкторов - C++
Всем доброго дня. Наткнулся в коде на интересные грабли: test.cpp #include &quot;test.h&quot; Test test; Test::Test() {

Порядок вызова конструкторов - C++
Есть классы First и Second. Класс Second наследуется от First. Я имею ввиду: class Second: public First { //... };


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Опции темы

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