代码之家  ›  专栏  ›  技术社区  ›  Proclyon

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

  •  1
  • Proclyon  · 技术社区  · 14 年前

    我还有另一个理论问题,正如标题所建议的,它是为了评估代码的构建。基本上,我正在考虑在任何地方使用这个模板。

    我使用的是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:
    };
    

    斯塔普尔

    #include "Stapel.h"
    
    Stapel::Stapel()
    {
    
    }
    
    Stapel::Stapel(int value)
    {
        set_x(value);
    }
    
    void Stapel::CleanUp()
    {
        //CleanUpCalls
    }
    

    这里的焦点是cleanup方法,基本上我想把这个方法放在我所有的文件中,并且在需要的时候让它执行删除调用,以确保它都在一个地方,我可以防止delete飞过去,作为一个新手,即使我知道这可能不是你想搞砸的东西,也不是一个草率的堆。

    这个版本怎么样?

    好坏?为什么?

    对于这样的任务使用析构函数呢?

    2 回复  |  直到 9 年前
        1
  •  8
  •   Björn Pollex    14 年前

    Boost为 RAII -样式堆管理:

    1. Smart pointer (这里有几种不同场景的实现)
    2. Pointer Containers

    你方建议的缺点:

    1. 在您的实现中,您仍然必须记住在 CleanUp -方法来分配您所执行的每个堆。如果程序具有任何类型的非线性控制流(某些分配可能只在某些情况下发生),跟踪这些分配可能非常困难。通过将资源的释放(在本例中是内存)绑定到堆栈上对象的生存期,您不必担心 同样多 . 您仍然需要考虑像循环引用这样的事情。
    2. RAII帮助你写作 exception-safe 代码。
    3. 根据我的经验,RAII导致了更结构化的代码。仅在某个循环或分支中需要的对象不会在其他地方初始化,而是在块中需要它们的地方初始化。这使得代码更容易阅读和维护。

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

    1. 参考文献
    2. 灵巧的指针
    3. 指针容器(如果它是拥有指针的容器)

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

        2
  •  7
  •   David Rodríguez - dribeas    14 年前

    使用智能指针和RAII代替。不会把所有的 delete 在一个地方,但应该从代码中删除它们。如果您需要自己执行任何清理,这就是析构函数的用途,请使用它们作为 惯例 在C++中。