Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Apparat_UA
6 / 6 / 2
Регистрация: 06.01.2015
Сообщений: 177
1

При выделении памяти через malloc, как создавать объекты ?

10.11.2016, 10:01. Просмотров 817. Ответов 9
Метки нет (Все метки)

Выделяю память через malloc под 4 объекта, как их создать ?
C++
1
2
3
4
5
6
myClass * ptr = (myClass*) malloc(sizeof(myClass)*4);
 
for(int i = 0; i < 4; ++i)
{
    ptr[i] = myClass();
}
так создаются лишние временные экземпляры
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2016, 10:01
Ответы с готовыми решениями:

Ошибка при выделении памяти с помощью malloc
Помогите выдает ошибку в рядочке :&quot;Ar = ( far *)malloc(size*sizeof(int));&quot;...

Как сделать так чтобы при каждом выделении памяти в методе была возможность ее очистить и вернуть результат?
Доброго времени суток! Есть код класса и хотелось бы устранить в нем следующие...

Выделение памяти через malloc и считывание данных
Здравствуйте. Имеется файл, в котором 6 чисел типа double. В программе имеется...

Ошибка при выделении памяти
Вопрос: из-за чего программа может рушится? int *NRRow = new int ; int *NRow...

Ошибка при выделении памяти
Здравствуйте, друзья. Подскажите, пожалуйста, почему выскакивает ошибка при...

9
nmcf
6277 / 5578 / 2539
Регистрация: 14.04.2014
Сообщений: 23,471
10.11.2016, 10:04 2
Для объектов предназначена new - вот и применяй.
0
hoggy
Нарушитель
Эксперт С++
7087 / 3130 / 648
Регистрация: 15.11.2014
Сообщений: 7,209
Завершенные тесты: 1
10.11.2016, 10:05 3
Лучший ответ Сообщение было отмечено Apparat_UA как решение

Решение

Цитата Сообщение от Apparat_UA Посмотреть сообщение
так создаются лишние временные экземпляры
http://rextester.com/EFU38347

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
struct myClass
{
    myClass() { std::cout << "ctor\n"; }
    myClass(const myClass&) { std::cout << "copy\n"; }
};
 
int main()
{
    std::cout << "Hello, world!\n";
    
    
    myClass * ptr = (myClass*) malloc(sizeof(myClass)*4);
 
    for(int i = 0; i < 4; ++i)
        new(ptr + i) myClass;
}
1
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4772 / 2429 / 679
Регистрация: 18.10.2014
Сообщений: 4,150
10.11.2016, 11:04 4
Лучший ответ Сообщение было отмечено Apparat_UA как решение

Решение

C++
1
2
myClass *ptr = (myClass *) malloc(4 * sizeof *ptr);
std::uninitialized_fill_n(ptr, 4, myClass());
а в С++17

C++
1
2
myClass *ptr = (myClass *) malloc(4 * sizeof *ptr);
std::uninitialized_default_construct_n(ptr, 4);
2
Apparat_UA
6 / 6 / 2
Регистрация: 06.01.2015
Сообщений: 177
10.11.2016, 13:37  [ТС] 5
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
std::uninitialized_fill_n(ptr, 4, myClass());
Есть подобная функция для удаления потом этих объектов ?
0
Martein
680 / 91 / 15
Регистрация: 22.06.2014
Сообщений: 192
10.11.2016, 14:14 6
TheCalligrapher, что-то на gcc 6.2.1 x86_64 (Arch Linux) не включается стандарт C++17. так должно быть, не знаете?
0
DrOffset
8464 / 4741 / 1161
Регистрация: 30.01.2014
Сообщений: 7,727
10.11.2016, 15:59 7
Цитата Сообщение от Martein Посмотреть сообщение
не включается стандарт C++17
Хочешь сказать ключ -std=c++1z не работает?
А вообще, конкретной возможности может еще не быть. Надо сверяться с информацией с сайта: https://gcc.gnu.org/projects/cxx-status.html#cxx1z
0
Croessmah
++Ͻ
14630 / 8379 / 1582
Регистрация: 27.09.2012
Сообщений: 20,583
Записей в блоге: 2
Завершенные тесты: 1
10.11.2016, 16:18 8
Цитата Сообщение от Apparat_UA Посмотреть сообщение
Есть подобная функция для удаления потом этих объектов ?
std::destroy,
std::destroy_n,
std::destroy_at.
Цитата Сообщение от Martein Посмотреть сообщение
что-то на gcc 6.2.1 x86_64
Если интересно, то могу на gcc 7.0 попробовать вечером.
0
Martein
680 / 91 / 15
Регистрация: 22.06.2014
Сообщений: 192
11.11.2016, 00:09 9
DrOffset, ну он проглатывает этот ключ, но компилировать не соглашается эти функции.
0
DrOffset
8464 / 4741 / 1161
Регистрация: 30.01.2014
Сообщений: 7,727
11.11.2016, 08:21 10
Цитата Сообщение от Martein Посмотреть сообщение
но компилировать не соглашается эти функции.
Ну тогда:
Цитата Сообщение от DrOffset Посмотреть сообщение
конкретной возможности может еще не быть. Надо сверяться с информацией с сайта
см. тут: https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html
Эти функции относятся к пункту "Extending memory management tools", реализация документа P0040R3. Судя по таблице, данная функциональность доступна только с 7й версии.
0
11.11.2016, 08:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2016, 08:21

Ошибка при выделении памяти
Когда убираю free(buf), то ошибки нету, а когда есть, то вылазит ошибка. Почему...

Ошибка при динамическом выделении памяти
почему у меня возникет ошибка вот тут struct TOVAR *New = new struct TOVAR;...

Ошибка при динамическом выделении памяти
Я не понимаю почему, но почему-то пример по динамическому выделению памяти,...


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

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

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