где разместить указатель? - PullRequest
0 голосов
/ 12 марта 2019

что такое защита между использованием

(1) HEAP num =* new HEAP

(2) HEAP *num = new HEAP

на с ++. Также при написании метода, как можно вернуть объект, если они используют (2)?

1 Ответ

3 голосов
/ 12 марта 2019

В C ++ символы часто меняют значение в зависимости от их контекста. В

HEAP num =* new HEAP

* - это оператор разыменования . Это получает значение объекта из указателя. *

В

HEAP *num = new HEAP

* не является оператором, это часть типа, обозначающая, что переменная является указателем.

* также используется в качестве оператора умножения. Обратите внимание, что * может быть перегружен, чтобы делать все, что хочет программист, но это должно быть зарезервировано для поведения, подобного умножению и разыменованию, чтобы избежать путаницы.

Так что же они делают?

HEAP num =* new HEAP

Копировать конструкции Автоматическая переменная HEAP num, которая представляет собой HEAP, с источником * new HEAP, где * new HEAP - указатель на Динамически распределяемое HEAP, которое быстро разыменовывается с помощью оператора *, чтобы получить его значение. Не используйте эту опцию, потому что нет указателя на динамическое распределение, что делает его практически невозможным для освобождения. Это утечка памяти.

HEAP *num = new HEAP

Инициализирует автоматически переменную HEAP *num, которая является указателем на HEAP, с указателем на динамически назначаемую HEAP. Избегайте использования этого параметра, поскольку он требует, чтобы программист вручную управлял владельцем выделения, путем delete, точно один раз в будущем. Удивительно, как трудно получить такую ​​простую вещь, чтобы понять все правильно.

Рекомендации

Предпочитают

HEAP num;

, которая является автоматической HEAP переменной, так что вам не нужно беспокоиться о владении или

std::unique_ptr<HEAP> num = std::make_unique<HEAP>();

, которая является автоматической std::unique_ptr<HEAP> переменной, которая содержит динамически распределенную HEAP и управляет владением для вас. Документация для std::unique_ptr.

Как вернуть (2)?

HEAP * getHeapPointer()
{
    HEAP * num = new HEAP;
    return num;
}

или просто

HEAP * getHeapPointer()
{
    return new HEAP;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...