Теория соглашения C ++ относительно очистки кучи, предлагаемая сборка, это хорошая практика? - PullRequest
1 голос
/ 06 сентября 2010

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

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

Stapel.h

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
}

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

А как насчет этой сборки?

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

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

Ответы [ 2 ]

8 голосов
/ 06 сентября 2010

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

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

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

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

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

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

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

7 голосов
/ 06 сентября 2010

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

...