【问题标题】:Theory on C++ convention regarding cleanup of the heap, a suggested build, is it good practice?关于清理堆的 C++ 约定的理论,建议的构建,是好的做法吗?
【发布时间】:2010-09-06 08:12:41
【问题描述】:

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

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

这里的重点是清理方法,基本上我想把这个方法放在我所有的文件中,并在需要时让它执行我的删除调用,以确保它们都在一个地方,我可以防止删除飞围绕它,作为一个菜鸟,就连我也知道可能不是你想乱七八糟的东西,也不是草率堆。

这个版本怎么样?

好坏?为什么?

那么在这些任务中使用析构函数呢?

【问题讨论】:

    标签: c++ conventions delete-operator


    【解决方案1】:

    Boost 为RAII-style heap-managment 提供了几个实用程序:

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

    你的提案的缺点:

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

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

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

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

    【讨论】:

    • 实际上听起来很神奇,只需点击谷歌进行提升并继续搜索我猜的清理吗?
    • @Proclyon:我不明白你的评论。无论如何,我已经收藏了书签;)
    • 缺点 #2 并不是 他的 提案的真正缺点,但仍然是 +1。
    • 基本上我的意思是,在哪里继续挖掘以获取更多信息?作为一个问题。
    • @Proclyon:这里的关键概念确实是 RAII。这就是您在 C++ 中处理清理的方式(简而言之,可以概括为“让析构函数完成工作”。Boost 只是一个库集合,它们 1)使用 RAII 本身,以及 2)提供一些工具(例如 smart指针),以便更轻松地将 RAII 语义添加到您自己的代码中。您需要了解的核心概念就是 RAII。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-02-14
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-24
      • 2014-05-29
      相关资源
      最近更新 更多