почему мой местный объект уничтожен дважды? - PullRequest
2 голосов
/ 20 мая 2011

У меня есть функция, возвращающая локальный объект:

class AT
{
public:
    AT() { cout<<"construct"<<endl; }

    AT(const AT& at) { cout<<"copy"<<endl; }

    ~AT() { cout<<"destroy"<<endl; }
};

AT funcAt()
{
    AT tmp;
    return tmp;
}
...
funcAt();

вывод:

construct
copy
destroy
destroy

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

Ответы [ 5 ]

8 голосов
/ 20 мая 2011

Давайте уточним это немного:

AT funcAt()
{
    AT tmp;           [1]
    return tmp;       [2]
}                     [3]
...
funcAt();             [4]

[1] создать объект AT в tmp
[2] скопировать tmp в возвращаемое значение
[3] уничтожить ТМП
[4] уничтожить возвращаемое значение, потому что оно не используется

1 голос
/ 20 мая 2011

tmp построен и разрушен.То же самое верно для возвращаемого значения (которое является новым объектом, а не просто ссылкой), хотя здесь используется конструктор cop.Вы не видите, что возвращаемое значение используется, но оно все еще передается.

1 голос
/ 20 мая 2011

Причина в том, что копия tmp возвращается из funcAt и нигде не сохраняется, поэтому C ++ уничтожает ее и вызывает деструктор

1 голос
/ 20 мая 2011

Поскольку оно

1) создано: AT tmp внутри funcAt
2) скопировано: return tmp;, и это потому, что функция возвращает копию: AT funcAt()
3) уничтожить- первый объект tmp и возвращенная копия

Подсказка: обратите внимание на copy в выводе:)

0 голосов
/ 20 мая 2011

Возвращаемое значение вашей функции - это отдельный объект (то есть копия) для локального объекта, используемого внутри функции.

...