Прежде всего, вам не нужна переменная-член Heap*
внутри вашего Heap
объекта, и вам определенно не следует выделять для нее память в конструкторе Heap
- это просто запрос за неприятности. Вы также не должны обращаться к переменным-членам как H->Elements
, а просто как Elements
.
Единственное, что вам нужно выделить, это массив Elements
.
Что касается обработки ошибок распределения, конструкторы должны указывать ошибки через исключение. Существует даже стандартный тип исключения, std::bad_alloc
, который обычно используется для обозначения сбоя при выделении памяти.
Например:
#include <stdexcept> // for std::bad_alloc
...
Heap::Heap (int maxElements)
{
Elements = ( ElementType* ) malloc ( ( maxElements+1 )*sizeof ( ElementType ) );
if (Elements == NULL)
throw std::bad_alloc("Failed to allocate memory");
...
}
Еще лучше, используйте new
вместо malloc
для выделения памяти. new
автоматически выдаст исключение типа std::bad_alloc
, если не удастся выделить память.
Пример: * * тысяча двадцать-пять
Heap::Heap (int maxElements)
{
Elements = new ElementType[maxElements + 1]; // throws std::bad_alloc on failure
...
}
Примечание: если вы используете new
для выделения объекта, вы должны использовать delete
для его освобождения, а не free
. ( Исправление : в приведенном выше примере вы используете новую форму массива, new[]
, поэтому вы должны вызывать форму удаления массива, delete[]
).
Наконец, вы не показали, как объявляется ElementType
, но если это тип, который имеет конструктор / деструктор не по умолчанию (или если это параметр шаблона, который означает, что он потенциально может быть таким типом), вы имеет для использования new
вместо malloc
при его выделении, потому что malloc
не вызовет конструктор (а free
не вызовет деструктор). Как правило, рекомендуется всегда использовать new
и delete
в C ++, а не malloc
и free
.