114 lines
2.9 KiB
C++
114 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";
|
|||
|
}
|
|||
|
*/
|