Управление памятью непросто для всех, особенно для новичков в C ++.Я рекомендую изучить термины stack
и heap
, которые, как мы надеемся, должны прояснить некоторые вопросы.
Я знаю, что когда у нас есть указатель на массив, это означает, что он создается динамически,поэтому я должен удалить его позже в моем деструкторе.
Это не совсем так, указатель - это просто переменная, которая содержит адрес (где живет переменная) чего-либо.Вы можете сделать указатель на любую переменную, подобную этой:
int a = 5;
int *aPtr = &a;
Это не означает, что a
или aPtr
являются динамическими.
Однако указатель, созданный таким образом, будетдинамический и должен быть удален:
int *aPtr = new int(5);
Самым большим отличием здесь является ключевое слово new
.new
создает динамическую память (что помещается в кучу).Каждый раз, когда вы используете ключевое слово new
, вы должны использовать ключевое слово delete
, чтобы соответствовать ему.
Но что, если у нас есть обычный массив, мне нужно включить оператор удаления вдеструктор для этого обычного массива тоже?или программа сделает это автоматически?например, у меня есть обычный массив, подобный этому int myArray[];
, и в моем деструкторе я должен включить это: delete[] myArray;
?
Нет, вам не нужно было бы вызывать delete[] myArray;
, потому что этомассив будет сделан в стеке.Под этим я подразумеваю, что при возврате из функции, создавшей этот массив, массив будет очищен из памяти.
Альтернативой ручному управлению памятью является использование std::array
, * 1035.* или даже умные указатели, такие как std::unique_ptr
или std::shared_ptr
, которые очищаются после того, как ссылка на них исчезла.
Надеюсь, это поможет!