Когда уже существующий указатель помещается в стек, создается ли его копия? - PullRequest
0 голосов
/ 02 февраля 2012
void deleteAllNodes ()
{
    stack <parentBranch *> mystack;

    // `trunk` is the existing head node
    mystack.push (trunk);

    cout << mystack.top ()->content;
}

В этом случае «копия» ствола помещается в стек? Значит ли это, что в памяти одновременно присутствуют два соединительных линии?

Ответы [ 3 ]

4 голосов
/ 02 февраля 2012

Неа. trunk указывает на объект, но не сам объект. Как табличка с надписью «Автомобиль ->» рядом с автомобилем. Когда вы нажимаете trunk на mystack, вы не получаете другую машину. Вы просто получаете другой знак, указывающий на ту же машину.

Горе, если вы отгоните машину (т. Е. delete trunk;). Тогда у вас будет целая куча знаков, указывающих на машину, но когда кто-то придет и попытается сесть в эту машину, он упадет на спину. Все знаки, указывающие на машину, будут лжецами.

3 голосов
/ 02 февраля 2012

A копия указателя выдвигается, но не копия объекта, на который она указывает.

3 голосов
/ 02 февраля 2012

Нет, есть только один trunk, но на него указывают два указателя.

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

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

Если вставляемый элемент является не указателем, а объектом, то будут две отдельные копии объекта: одна хранится в контейнере, а другая использовалась для вставки в контейнер.

...