@ManyBytes

Как правильно выделить память (с проверкой выделения) для массива класса?

При создании простеньких библиотек я столкнулся с непониманием, что предпочтительнее использовать для выделения памяти для массивов в классе:

1) Функцию на основе new / new(std::nothrow):
void alloc(size_t size)
{
	m_data = new(std::nothrow) T[size];  // m_data - указатель на массив, T - тип массива
	if (m_data == nullptr)
		throw std::runtime_error("Allocation error");
}

2) Перегруженный оператор new:
void* operator new[](size_t size)
{
        T* ptr = (T*)malloc(sizeof(T) * size);  // T - тип массива
        if (ptr == nullptr)
            throw("Allocation error");

        return ptr;
}

Какой из вариантов наиболее эффективен / наиболее используемый?
  • Вопрос задан
  • 186 просмотров
Решения вопроса 1
@res2001
Developer, ex-admin
какой из вариантов наиболее эффективен / наиболее используемый

Создание класса в динамической памяти делится на 2 этапа:
1. выделение "сырой" памяти у менеджера памяти
2. инициализация памяти - вызов конструктора класса на выделенном участке памяти.
Вариант с malloc не выполняет вторую часть. Для того что бы закончить процесс в этом варианте вам надо использовать размещающий new, передав указатель на ранее выделенную память. Деструкторы так же нужно будет вызывать явно.

Если вариант с malloc довести до логического конца, то он будет делать то же самое что и вариант с new, никаких преимуществ тут нет. Но не забываем про явный вызов деструктора.

При удалении класса из динамической памяти присутствуют обратные этапы: вызов деструктора и освобождение памяти.

malloc обычно используют в плюсовом коде, когда реализуют собственные аллокаторы и нужен "сырой" не инициализированный блок памяти. Но и в этом случае вполне можно обойтись без malloc - использовать new char[MEM_SIZE]
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Mercury13
Программист на «си с крестами» и не только
Но обычный new выкидывает std::bad_alloc.
Так что не совсем понятно, что вы хотите сделать, когда делаете new с флагом «не кидать», а потом при неудавшемся new кидаете аварию.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы