1

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

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

斯塔佩尔.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
}

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

这个建筑怎么样?

好坏 ?为什么 ?

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

4

2 回答 2

8

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

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

你的建议的缺点:

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

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

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

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

于 2010-09-06T08:15:16.737 回答
7

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

于 2010-09-06T08:15:06.503 回答