LINUX.ORG.RU

История изменений

Исправление 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;
}