Теория соглашения С++ об очистке кучи, предлагаемая сборка, является ли это хорошей практикой?

У меня есть еще один теоретический вопрос, как следует из названия, для оценки сборки кода. В основном я рассматриваю возможность использования этого шаблона везде.

Я использую VC++ VS2008 (все включено)

Стапель.ч

class Stapel
{
public:
    //local vars
    int x;

private:
public:
    Stapel();
    Stapel(int value);
    ~Stapel(){}

    //getters setters
    void set_x(int value)
    {
        x = value;
    }

    int get_x(int value)
    {   
        x = value;
    }   

void CleanUp();

private:
};

Stapel.cpp

#include "Stapel.h"

Stapel::Stapel()
{

}

Stapel::Stapel(int value)
{
    set_x(value);
}

void Stapel::CleanUp()
{
    //CleanUpCalls
}

Основное внимание здесь уделяется методу очистки, в основном я хочу поместить этот метод во все мои файлы повсюду и просто позволить ему выполнять мои вызовы удаления, когда это необходимо, чтобы убедиться, что все это в одном месте, и я могу предотвратить летание удаления, которое, как новичок, даже я знаю, что это, вероятно, не то, с чем вы хотите возиться или иметь неаккуратную кучу.

Что с этой сборкой?

Хорошо плохо ? Почему ?

А как насчет использования деструкторов для таких задач?


person Proclyon    schedule 06.09.2010    source источник


Ответы (2)


Boost предоставляет несколько утилит для управления кучей в стиле RAII:

  1. Умный указатель (здесь есть несколько реализаций для разных сценарии)
  2. Контейнеры указателей

Недостатки вашего предложения:

  1. В вашей реализации вам все еще нужно помнить о том, чтобы помещать удаление в метод CleanUp для каждого выделения кучи, которое вы делаете. Отследить эти распределения может быть очень сложно, если ваша программа имеет какой-либо нелинейный поток управления (некоторые распределения могут происходить только при определенных обстоятельствах). Привязав освобождение ресурсов (в данном случае памяти) к времени жизни объектов в стеке, вам не придется так сильно беспокоиться. Вам все равно придется учитывать такие вещи, как циклические ссылки.
  2. RAII помогает вам писать защищенный от исключений код.
  3. По моему опыту, RAII приводит к более структурированному коду. Объекты, которые нужны только внутри определенного цикла или ветки, будут инициализированы не где-то еще, а прямо внутри блока, где они нужны. Это упрощает чтение и сопровождение кода.

Изменить. Хороший способ начать реализацию — получить Boost. Затем найдите в своем коде необработанные указатели и попробуйте заменить каждый указатель на

  1. Ссылка
  2. Смарт-указатель
  3. Контейнер указателя, если это контейнер, которому принадлежат указатели

Если это будет сделано, ваш код больше не должен содержать delete. Если вы используете make_shared, вы даже можете удалить все newс. Если вы столкнетесь с какими-либо проблемами, которые не сможете решить самостоятельно, посетите stackoverflow.com... о, подождите, вы уже это знаете;)

person Björn Pollex    schedule 06.09.2010
comment
Звучит потрясающе на самом деле, просто нажмите Google для повышения и продолжите поиск очистки там, я думаю? - person Proclyon; 06.09.2010
comment
@Proclyon: я не понимаю вашего комментария. Во всяком случае, у меня есть повышение в закладках ;) - person Björn Pollex; 06.09.2010
comment
Недостаток №2 на самом деле не является недостатком его предложения, но тем не менее +1. - person You; 06.09.2010
comment
в основном я имел в виду, где продолжить копать для получения дополнительной информации? как вопрос. - person Proclyon; 06.09.2010
comment
@Proclyon: Ссылки, которые я предоставил, приведут вас непосредственно к библиотекам повышения, о которых я упоминал. Там многое объясняется. Статья в Википедии тоже помогает и должна дать вам достаточно ключевых слов для дальнейшего поиска в Google. - person Björn Pollex; 06.09.2010
comment
@Proclyon: я добавил несколько советов о том, как это реализовать. - person Björn Pollex; 06.09.2010
comment
@Proclyon: ключевой концепцией здесь действительно является RAII. Вот как вы обрабатываете очистку в C ++ (и, короче говоря, можно резюмировать, что деструктор выполняет работу. Boost - это просто набор библиотек, которые 1) сами используют RAII и 2) предоставляют некоторые инструменты (например, интеллектуальные указатели) чтобы упростить добавление семантики RAII в собственный код. Основная концепция, которую вам нужно понять, — это просто RAII. - person jalf; 06.09.2010
comment
Большое спасибо! Это очень помогло! - person Proclyon; 08.09.2010

Вместо этого используйте интеллектуальные указатели и RAII. Это не будет центрировать все delete в одном месте, а скорее удалит их из вашего кода. Если вам нужно выполнить какую-либо очистку самостоятельно, для чего и нужны деструкторы, используйте их, так как это соглашение в C++.

person David Rodríguez - dribeas    schedule 06.09.2010