2010-12-04 3 views
4

если у меня есть строка в классе, тогда выделена память. Должен ли я уничтожить строку в деструкторе? напримерМне нужно уничтожить строку в C++

 
class A { 
    string Test; 
    A() { 
    Test = "hello world"; 
    } 

    A(string &name) { 
    Test = name; 
    } 

    ~A() { 
    // do I have to destroy the string here? 
    } 
} 

Я старый программист c/C++ (pre stl) и возвращаюсь в C++. Является ли строка уничтоженной автоматически с помощью магии шаблона?

ТИА, Дэйв

+1

в вашем примере, `` `` `` `` `` `` `std :: string`? – SingleNegationElimination 2010-12-04 01:11:08

+0

Интересная вещь (для меня) заключается в деструкторе. Предоставляет ли C++ гарантию того, что объекты-члены будут уничтожены после вызова конструктора родительского объекта? Могу ли я каким-то образом предотвратить это? (Просто из любопытства, возможно, вы можете привести соответствующие разделы стандарта C++.) – 2010-12-04 01:19:29

+0

C++ гарантирует, что ваши члены класса будут уничтожены в противоположном порядке, из которого они были созданы (это порядок, в котором они были объявлены). Более читаемое объяснение, чем стандарт C++: http://msdn.microsoft.com/en-us/library/8183zf3x(VS.80).aspx – cgmb 2010-12-04 01:47:03

ответ

5

Да. Строки и контейнеры выделяют/освобождают вас. ОДНАКО, контейнер указателей не освобождает то, на что указывают эти указатели. Вы должны пройти через них сами.

2

Нет. Деструктор строки вызывается, как только экземпляр A выходит из области видимости.

2

Вы не создаете указатель на строку, поэтому Test будет выделен в стек (предположим, что объект A был выделен в стек). Таким образом, когда он покидает область действия, он будет автоматически освобожден. Если Test был указателем, он был бы выделен в куче, и вам нужно будет удалить его в деструкторе.

0

Вы очищаете свой беспорядок, а стандартная библиотека очищает свой беспорядок. Память, которую выделяет std :: string, - это беспорядок.

Поведение по умолчанию для деструктора - это вызов деструкторов для каждой базы и элемента данных. Ваша строка является членом данных, поэтому ее деструктор вызывается. Его деструктор делает все, что нужно сделать здесь, поэтому больше нет необходимости (и на самом деле было бы очень неправильно) чистить что-нибудь здесь, чем если бы у вас была строка как локальная переменная в main().

Смежные вопросы