RAII-类别指针和范围
RAII - Class Pointers and Scope
我想通过一个例子更好地理解如何用我的类实现RAII习惯用法:建议使用什么方法来确保指针在我的类中正确地自由()?
我有一个课程,应该在课程期间存在。本着RAII的精神,因为我需要将对这个类的引用传递给其他类,所以我将它保存在shared_ptr中(不确定它是否真的需要保存在shared-ptr中,但为了好玩,它确实需要)。
在类ctor中,我使用2个缓冲区(指针),然后多次循环malloc()'ing,使用缓冲区,然后循环free()'ing。dtor应该包含故障保护代码,以便在发生事故时释放缓冲区。
dtor查看缓冲区的唯一方法是将它们声明为类变量,但它们仅在类ctor中使用。
示例:
class Input
{
private:
PSOMETYPE buffer1;
public:
Input();
~Input();
}
Input::Input() : buffer1(NULL)
{
for(blahblah)
{
buffer1 = (PSOMETYPE)malloc(sizeof(SOMETYPE));
// Do work w/buffer1
if(buffer1 != NULL) { free(buffer1); buffer1 = NULL }
}
}
Input::~Input()
{
if(buffer1 != NULL) { free(buffer1); buffer1 = NULL }
}
考虑到我只在ctor中使用缓冲区,将其声明为私有类变量有意义吗?如果我在ctor的范围内声明它,dtor将不知道它是免费的。
我知道这是一个微不足道的例子,老实说,我可以实现这一点,因为我很容易忘记使用智能指针来引用我的类,并且有一个空白的dtor,就像我在循环中所做的那样,只是free()。我没有导师,也没有受过教育,我不确定什么时候应该遵循RAII成语。
RAII的精神是使用本地对象来管理本地分配的对象,而不是人为地将其生命周期与正在构建的对象绑定:
class Input
{
// no pointer at all, if it's only needed in the constructor
public:
Input();
// no explicit destructor, since there's nothing to explicitly destroy
};
Input::Input()
{
for(blahblah)
{
std::unique_ptr<SOMETYPE> buffer1(new SOMETYPE);
// or, unless SOMETYPE is huge, create a local object instead:
SOMETYPE buffer1;
// Do work w/buffer1
} // memory released automatically here
}
如果您正在编写一个旨在管理资源的类,那么您只需要自己使用delete
(或free
,或其他什么),而且通常已经有一个标准类(如智能指针或容器)可以满足您的要求。
当您确实需要编写自己的管理类时,请始终记住"三条规则":如果您的析构函数删除了某些内容,那么该类的默认复制行为几乎肯定会导致双重删除,因此您需要声明一个复制构造函数和复制赋值运算符来防止这种情况发生。例如,在你的课上,我可以写以下错误的代码:
{
Input i1; // allocates a buffer, holds a pointer to it
Input i2(i1); // copies the pointer to the same buffer
} // BOOM! destroys both objects, freeing the buffer twice
防止这种情况的最简单方法是删除复制操作,这样类似的代码将无法编译:
class Input {
Input(Input const&) = delete; // no copy constructor
void operator=(Input) = delete; // no copy assignment
};
较旧的编译器可能不支持= delete
;在这种情况下,您可以通过在没有= delete
的情况下私下声明它们而不实现它们来获得几乎相同的效果。
- 正在将指针转换为范围
- 通过函数指针定义类范围之外的方法
- 如果非动态变量被指针引用,何时超出范围?
- 访问提升:shared_ptr 主范围外崩溃,断言失败:px != 0.指针的正确用法是什么?
- 指向地址的指针似乎调整在范围之外
- 使用基于范围的指针循环和向量时出现C++错误
- 使用基于范围的for循环取消对矢量指针的引用
- 如何避免指针超出范围(多态性)的C++分段错误
- 用基于范围的for循环填充指针向量
- 指针上的 For 循环:它会移动整个地址范围吗?
- 从原始指针(衰减的 C 样式数组)和大小生成范围::视图
- 对智能指针范围的混淆
- 指针范围问题和返回类中封装的指针向量内的指针引用
- 如何打印出唯一指针对象向量中的值(基于范围的循环)?C++
- 基于范围的 for 循环,用于包含C++中的指针的自定义链表,仅返回对象
- 在具有范围的指针上运行
- C++ |方法范围指针管理
- 为什么在提升中限定范围指针
- c++ Word自动化中_variant_t范围指针的问题(AddPicture()方法)
- 标准中关于超出范围指针的未定义行为的歧义