关于堆清理的C++约定的理论,建议的构建,这是一个好的做法吗?

Pro*_*yon 1 c++ conventions delete-operator

我有另一个理论问题,因为标题建议它是评估代码的构建.基本上我在考虑到处使用这个模板.

我使用的是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:
};
Run Code Online (Sandbox Code Playgroud)

Stapel.cpp

#include "Stapel.h"

Stapel::Stapel()
{

}

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

void Stapel::CleanUp()
{
    //CleanUpCalls
}
Run Code Online (Sandbox Code Playgroud)

这里的重点是清理方法,基本上我想把这个方法放在我所有的文件中,只需要让它在需要时进行删除调用,以确保它在一个地方,我可以防止删除周围的飞行,作为一个新秀,即使我知道可能不是你想乱搞的东西,也不是一个草率的堆.

这个版本怎么样?

好坏 ?为什么?

那么使用析构函数来完成这些任务呢?

Bjö*_*lex 8

Boost为RAII风格的堆管理提供了几个实用程序:

  1. 智能指针(这里有几种不同场景的实现)
  2. 指针容器

您的提案的缺点:

  1. 在您的实现中,您仍然需要记住在CleanUp-method中为每个堆分配放置一个删除.如果您的程序具有任何类型的非线性控制流(某些分配可能仅在某些情况下发生),则跟踪这些分配可能非常困难.通过将资源的释放(在本例中为内存)绑定到堆栈上对象的生命周期,您不必担心这么多.你仍然需要考虑循环引用之类的东西.
  2. RAII可以帮助您编写异常安全的代码.
  3. 根据我的经验,RAII会带来更多结构化代码.只在某个循环或分支内部需要的对象不会在其他地方初始化,而是在需要它们的块内部.这使代码更易于阅读和维护.

编辑:开始实施的一个好方法是获得Boost.然后在代码中搜索原始指针,并尝试替换每个指针

  1. 一个参考
  2. 一个智能指针
  3. 指针容器,如果它是拥有指针的容器

如果这样做,您的代码不应再包含任何deletes.如果你使用make_shared,你甚至可以消除所有news.如果你遇到任何你自己无法解决的问题,请查看stackoverflow.com ...哦等等,你知道那个已经;)


Dav*_*eas 7

请改用智能指针和RAII.这不会将所有deletes集中在一个地方,而是从代码中删除它们.如果您需要自己执行任何清理,这就是析构函数的用法,请使用它们,因为这是C++中的约定.