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

C++ C+理论+;关于堆清理的约定,一个建议的构建,是好的实践吗?,c++,conventions,delete-operator,C++,Conventions,Delete Operator,我还有另一个理论问题,正如标题所暗示的,那就是评估代码的构建。基本上,我正在考虑在任何地方使用这个模板 我正在使用VC++VS2008(全部包括在内) 斯塔佩尔 Stapel.cpp 这里的重点是清理方法,基本上我想把这个方法放在我所有的文件中,只要在需要的时候让它做我的删除调用,以确保它在一个地方,我可以防止删除的飞行,作为一个新手,就连我也知道,这可能不是你想乱搞的东西,也不是一堆乱七八糟的东西 这个版本怎么样 好的坏的?为什么? 对于这样的任务,使用析构函数怎么样?使用智能指针和RAII。

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

我正在使用VC++VS2008(全部包括在内)

斯塔佩尔

Stapel.cpp

这里的重点是清理方法,基本上我想把这个方法放在我所有的文件中,只要在需要的时候让它做我的删除调用,以确保它在一个地方,我可以防止删除的飞行,作为一个新手,就连我也知道,这可能不是你想乱搞的东西,也不是一堆乱七八糟的东西

这个版本怎么样

好的坏的?为什么?


对于这样的任务,使用析构函数怎么样?

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

< P> Boost为-Hype堆管理提供了几种实用工具:

  • (对于不同的场景,这里有几种实现)
  • 你的建议的缺点:

  • 在您的实现中,对于您执行的每个堆分配,您仍然必须记住在
    CleanUp
    -方法中放置一个delete。如果您的程序具有任何类型的非线性控制流(某些分配可能仅在特定情况下发生),则跟踪这些分配可能非常困难。通过将资源(在本例中为内存)的释放绑定到堆栈上对象的生存期,您不必担心太多。你仍然需要考虑诸如循环引用之类的事情。<李>
  • RAII帮助您编写代码
  • 根据我的经验,RAII导致了更结构化的代码。仅在某个循环或分支内需要的对象不会在其他地方初始化,而是在需要它们的块内初始化。这使得代码更易于阅读和维护
  • 编辑:开始实施的一个好方法是获取。然后在代码中搜索原始指针,并尝试用

  • 推荐人
  • 智能指针
  • 指针容器,如果它是拥有指针的容器

  • 如果这样做,您的代码将不再包含任何
    delete
    s。如果使用,您甚至可以消除所有
    new
    s。如果你遇到任何自己无法解决的问题,请查看。。。哦,等等,你已经知道了;)

    Boost提供了几种用于类似堆管理的实用程序:

  • (对于不同的场景,这里有几种实现)
  • 你的建议的缺点:

  • 在您的实现中,对于您执行的每个堆分配,您仍然必须记住在
    CleanUp
    -方法中放置一个delete。如果您的程序具有任何类型的非线性控制流(某些分配可能仅在特定情况下发生),则跟踪这些分配可能非常困难。通过将资源(在本例中为内存)的释放绑定到堆栈上对象的生存期,您不必担心太多。你仍然需要考虑诸如循环引用之类的事情。<李>
  • RAII帮助您编写代码
  • 根据我的经验,RAII导致了更结构化的代码。仅在某个循环或分支内需要的对象不会在其他地方初始化,而是在需要它们的块内初始化。这使得代码更易于阅读和维护
  • 编辑:开始实施的一个好方法是获取。然后在代码中搜索原始指针,并尝试用

  • 推荐人
  • 智能指针
  • 指针容器,如果它是拥有指针的容器

  • 如果这样做,您的代码将不再包含任何
    delete
    s。如果使用,您甚至可以消除所有
    new
    s。如果你遇到任何自己无法解决的问题,请查看。。。哦,等等,你已经知道了;)

    听起来真是太棒了,我想只要点击谷歌的boost并继续搜索那里的清理工作就行了?@Proclyon:我不明白你的评论。无论如何,我已经把boost添加到书签中;)缺点#2并不是他的建议的真正缺点,但仍然是+1。基本上我的意思是,在哪里继续挖掘更多信息?作为一个问题,@proclion:这里的关键概念实际上是RAII。这就是你如何处理C++中的清理(简而言之),可以概括为“让析构函数完成工作”。Boost只是一个库集合,1)使用RAIIN本身,2)提供一些工具(如智能指针),以便更容易地将RAII语义添加到自己的代码中。你需要理解的核心概念就是RAII。听起来真是太棒了,只是点击谷歌搜索boost,然后继续搜索那里的清理工作,我想是吧?@Proclyon:我不理解你的评论。无论如何,我已经把boost添加到书签中;)缺点#2并不是他的建议的真正缺点,但仍然是+1。基本上我的意思是,在哪里继续挖掘更多信息?作为一个问题,@proclion:这里的关键概念实际上是RAII。这就是你如何处理C++中的清理(简而言之),可以概括为“让析构函数完成工作”。Boost只是一个库集合,1)使用RAIIN本身,2)提供一些工具(如智能指针),以便更容易地将RAII语义添加到自己的代码中。你需要理解的核心概念就是RAII。
    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
    }