This repository has been archived on 2023-05-13. You can view files and clone it, but cannot push or open issues or pull requests.
mipt_cpp/seminar02_encapsulation/classroom_tasks/code/2string/03destructor.cpp

114 lines
2.9 KiB
C++
Raw Normal View History

2022-09-14 19:05:27 +03:00
/*
В конструкторе мы выделили память с malloc, но нигде в программе её не освободили
Соответственно, в предыдущей программе у нас есть очень серьёзная ошибка - утечка памяти.
Где же нужно освобождать память?
Если память была выделена в конструкторе при создании объекта, то выделять её нужно при удалении объекта.
Для того, чтобы испольнить ваш код при удалении объекта существует специальный метод, который называется Деструктор.
Деструктор - это специальный метод, который вызывается тогда, когда объект уничтожается
Объекты, созданные на стеке удаляются при выходе из области видимости
Синтаксис деструктора такой:
~String()
{
...
}
*/
#include <iostream>
#include <cstdlib>
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";
}
*/