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
2022-09-14 19:05:27 +03:00

113 lines
2.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
В конструкторе мы выделили память с 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";
}
*/