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