使用带有字符指针的RAII

eri*_*ich 4 c++ memory-management raii resource-management

我看到很多RAII示例类包装文件句柄.

我试图在没有运气的情况下将这些示例适用于字符指针.

我正在使用的库具有获取字符指针地址的函数(声明为get_me_a_string(char**x)).这些函数为该字符指针分配内存,并将其留给库的最终用户,以便在自己的代码中清理它.

所以,我的代码看起来像这样......

char* a = NULL;
char* b = NULL;
char* c = NULL;

get_me_a_string(&a);
if(a == NULL){
    return;
}


get_me_a_beer(&b);
if(b == NULL){
    if(a != NULL){
        free(a);
    }
    return;
}


get_me_something(&c);
if(c == NULL){
    if(a != NULL){
        free(a);
    }
    if(b != NULL){
        free(b);
    }
    return;
}

if(a != NULL){
    free(a);
}
if(b != NULL){
    free(b);
}
if(a != NULL){
    free(b);
}
Run Code Online (Sandbox Code Playgroud)

听起来RAII就是我上面这个烂摊子的答案.有人可以提供一个简单的C++类来包装char*而不是FILE*吗?

谢谢

dir*_*tly 5

标准库中已有一些东西可用:它被称为std::string.

编辑:根据新信息:

它将分配内存并填满.我可以将内容复制到一个新的std :: string对象中,但我仍然必须释放该函数分配的内存.

这是实现者部分的糟糕设计 - 分配的模块应该负责解除分配.

好的,既然我已经从我的系统中解决了这个问题:你可以使用它boost::shared_ptr来解放.

template<typename T>
struct free_functor
{
    void operator() (T* ptr)
    {
        free(ptr);
        ptr=NULL;            
    }
};
shared_ptr<X> px(&x, free_functor());
Run Code Online (Sandbox Code Playgroud)