История изменений
Исправление Kroz, (текущая версия) :
Я уже упомянул, что работа с памятью часто закладывается в сами типы. Происходит это просто: в конструкторе (который вызывается при создании объекта) память выделяется, в деструкторе (который вызывается при уничтожении объекта) память очищается.
И этот принцип может относиться к любым ресурсам, не только к памяти. Да и не только к ресурсам. В примере ниже еще и корректно закрывается файл.
Еще раз обращу внимание: деструктор вызывается автоматически, а значит, если использовать такой подход, риска не-освободить память нет.
И поскольку это подход заложен много где (в том числе в стандартной библиотеке шаблонов), в С++ практически никогда не нужно самостоятельно выделять и очищать память. В отличии от С, где это делается повсеместно.
#include <iostream>
#include <cstdio>
using namespace std;
class Container
{
public:
int *mem;
FILE *f;
Container()
{
mem = new int [100];
f = fopen("test.txt","r");
cout << "Allocate" << endl;
};
~Container()
{
delete [] mem;
fclose(f);
cout << "Release" << endl;
};
};
void fn()
{
Container a;
cout << "Inside fn()" << endl;
};
int main()
{
fn();
return 0;
}
$ g++ ./cpp_RAII.cpp && ./a.out
Allocate
Inside fn()
Release
Исходная версия Kroz, :
Case 3: RAII
Я уже упомянул, что работа с памятью часто закладывается в сами типы. Происходит это просто: в конструкторе (который вызывается при создании объекта) память выделяется, в деструкторе (который вызывается при уничтожении объекта) память очищается.
И этот принцип может относиться к любым ресурсам, не только к памяти. Да и не только к ресурсам. В примере ниже еще и корректно закрывается файл.
Еще раз обращу внимание: деструктор вызывается автоматически, а значит, если использовать такой подход, риска не-освободить память нет.
И поскольку это подход заложен много где (в том числе в стандартной библиотеке шаблонов), в С++ практически никогда не нужно самостоятельно выделять и очищать память. В отличии от С, где это делается повсеместно.
#include <iostream>
#include <cstdio>
using namespace std;
class Container
{
public:
int *mem;
FILE *f;
Container()
{
mem = new int [100];
f = fopen("test.txt","r");
};
~Container()
{
delete [] mem;
fclose(f);
};
};
void fn()
{
Container a;
cout << "Inside fn()" << endl;
};
int main()
{
fn();
return 0;
}