【发布时间】:2012-03-13 15:54:16
【问题描述】:
我想通过一个示例更好地了解如何在我的类中实现 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()'ing。我没有导师也没有受过教育,我不确定何时应该遵循 RAII 习语。
【问题讨论】:
-
这是 C 和 C++ 思想的一种奇怪组合……您使用 malloc 而不是新的,甚至更好的 STL 模板化容器有什么原因吗?那些更适合 RAII 的概念
-
@tmpearce:这是由于我缺乏经验并且使用 MSDN 作为学习资源。我感谢替代/改进的参考。
标签: c++ design-patterns raii