/* В конструкторе мы выделили память с malloc, но нигде в программе её не освободили Соответственно, в предыдущей программе у нас есть очень серьёзная ошибка - утечка памяти. Где же нужно освобождать память? Если память была выделена в конструкторе при создании объекта, то выделять её нужно при удалении объекта. Для того, чтобы испольнить ваш код при удалении объекта существует специальный метод, который называется Деструктор. Деструктор - это специальный метод, который вызывается тогда, когда объект уничтожается Объекты, созданные на стеке удаляются при выходе из области видимости Синтаксис деструктора такой: ~String() { ... } */ #include #include using std::cout, std::endl, std::size_t; class String { private: size_t mSize; size_t mCapacity; char* mpData; public: String(const char* str) { cout << "Constructor of " << str << endl; size_t i = 0; while (str[i] != '\0') i++; mSize = i; mCapacity = i + 1; mpData = (char*)std::malloc(sizeof(char) * mCapacity); for (size_t i = 0; str[i] != '\0'; i++) mpData[i] = str[i]; mpData[mSize] = '\0'; } ~String() { cout << "Destructor of " << mpData << endl; std::free(mpData); } size_t getSize() const { return mSize; } size_t getCapacity() const { return mCapacity; } const char* cStr() const { return mpData; } }; std::ostream& operator<<(std::ostream& left, const String& right) { left << right.cStr(); return left; } int main() { String a = "Cat"; String b = "Dog"; if (true) { String c = "Lion"; } String c = "Bear"; } /* Задание: 1) Что напечатает данная программа? В каком порядке вызовутся конструкторы 2) Если создать строку String в цикле, то будут ли каждую итерацию вызываться конструкторы и деструкторы? for (int i = 0; i < 10; ++i) { String s = "Elephant"; } */