Професионална програма
Loading...
Hristo_Penchev avatar Hristo_Penchev 389 Точки

C++ презаписване на деструктори - продължава ли да зачиства паметта?

Здравейте,

Опитвам се да разбера как работят деструкторите и какво се случва, когато ги презапишем. Разсъждавам по аналогия с Java и C#.

Доколкото разбирам има дефолтен деструктор. Най-вероятно долу изглежда нещо от рода на:
~MyClass()

{

    deleteFromMemory();

}

 

Ако обаче ние имплементираме деструктор, фактически овърлоудваме дефолтния. Примерно правим

~MyClass()

{

    cout << "MyClass has been destroyed";

}

 

Обаче никъде в нашия деструктор ние не му казваме да си зачисти паметта. Не трябва ли вътре в него да извикаме деструктора на базовия метод или нещо такова?

Тагове:
1
C++ Programming
M.Yankov avatar M.Yankov 52 Точки

И аз имам един въпрос за деструкторите. Питам тук за да не отварям нова тема: Кода е следния:
 

inline ~Building()
{
    printf("Building destructor called for %s \n", _companyName); // strange symbols
    cout << "Building destructor called for " << _companyName << endl; // normal output
}

 

когато ползавм printf() в деструктура ми принтира странни символи от сорта на на ╞╟╚¶, което си мисля че, е рефернция към памета или нещо от подобно. А когато извиквам чрез cout всичко е нормално.
Някой може ли да разясни защо се получава така?

1
jicata avatar jicata Trainer 7 Точки

Въпроса всякаш не е свързан конкретно с деструктурите а по-скоро с плейсхолдърите в printf(). Тъй като аз срещнах нещо подобно днес, направих един кратък рисърч, който ме доведе до C++ Reference - printf(). Това което открих е, че плейсхолдъра, който принципно очакваме (от Java поне) да отговаря на стринг - %s  всъщност приема пойнтър към character - *char, даже по-конкретно:

The argument must be a pointer to the initial element of an array of characters

Съответно техният пример е  

const char* s = "Hello";

което при 

printf("%s World", s);

принтира "Hello World". С други думи в твоя случай, просто можеш да използваш или char* name = .... или char name[] = ... и играта спи :) Поздрави!

 

1
CharlieScarver avatar CharlieScarver 33 Точки

Плейсхолдъра %s отговаря за const char*, а не за std::string.
В printf няма плейсхолдър за std::string.
1) Едното решение е, както jicata е казал, да използваш char*.

2) Втори вариант е да ползваш std::string и като принтираш (с printf) да ползваш c_str(), което ще преобразува std::string-a ти в char*. (не знам колко е бавно/бързо)
 

printf("Person %s destroyed\n", this->name.c_str());

 

1
M.Yankov avatar M.Yankov 52 Точки

Мерси за отговорите и двата начина, които дадохте работят. Естествено сега ми изникват още въпроси: от сорта на има ли значение как се деклариара променливата ? явно няма значение къде точно е поставен оператора *

char* name;
char *     name;
char *name;

 

 

 

 

0
Filkolev avatar Filkolev 4482 Точки

Въпрос на конвенция. Дори повечето инструменти за форматиране на кода имат опции за това къде да се намира звездата.

Като цяло е прието да е залепена за идентификатора. На мен лично ми е по-логично да е залепена за типа, защото го считам за част от типа, но явно мнозинството мисли по-различно.

1