Указатель на объект и его деструктор - PullRequest
0 голосов
/ 01 апреля 2012
class finder
{
    public:
        finder();
        ~finder();
}

int _tmain(int argc, _TCHAR* argv[])
{
    finder* pfind = new finder(L"test");
    finder find(L"test2");
    system("PAUSE");
    return 0;
}

То, что я знаю, что деструктор find будет вызываться после выхода из программы, но деструктор pfind вызываться не будет.Мой вопрос почему?И я должен добавить

delete _pfind;

до возврата 0?

Ответы [ 3 ]

3 голосов
/ 01 апреля 2012

«Почему» заключается в том, что вы отвечаете за управление временем жизни объектов, которые вы создаете с помощью new.

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

Объекты динамической длительности хранения (например, на которые указывает pfind) сохраняются до тех пор, пока вы их не удалите.,Ничто не удалит их для вас.

Так что да, вам нужно удалить его самостоятельно в этом случае, с помощью delete pfind;.

(или используйте соответствующий тип интеллектуального указателя для вашего варианта использования.)

1 голос
/ 01 апреля 2012

Да, вы должны явно очистить выделенную память, вызвав delete на ваших неуправляемых указателях. Обычно любой блок кода, который выделяет память через new, должен быть сбалансирован блоком кода, который освобождает эту память через delete.

0 голосов
/ 01 апреля 2012

Мэт прав, однако я заметил, что вы используете CLR / .Net C ++ (или как они это называют в наши дни).Я считаю, что это происходит с ключевым словом gcnew, которое будет делать то же самое, что и ключевое слово new, но удалит объект в конце его области видимости.Это также называется сборкой мусора.Личные заметки, имеющие как new, так и gcnew, являются отличным инструментом, потому что они оба прекрасно вписываются в разные ситуации.Пожалуйста, имейте в виду, что ваш код не будет кроссплатформенным, если вы используете gcnew.

...