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