将char *提供给std :: string进行管理(最终释放内存)

时间:2015-08-18 14:35:26

标签: c++ c++11

我必须使用一个库函数,为生成的字符串分配一些内存并返回char*,期望调用者最终使用free()释放内存。

// Example declaration of the library function:
char* foo();
// ...
// Example usage:
auto foo_str = foo();
// ...
free(foo_str);

是否可以从此指针构造std::string,将内存的所有权传递给字符串对象,以便在字符串被销毁时释放它?我知道我可以实现我自己的包装器来提供这种RAII行为,但我猜这个轮子已经发明了一次。

3 个答案:

答案 0 :(得分:4)

不,你不能使用string来做这件事。 string始终拥有其缓冲区,并将分配和释放自己的缓冲区。您无法所有权转移到string。我甚至都不知道是否有这样的建议。

一个容器,您可以将所有权转移到:unique_ptr

struct free_deleter {
    void operator()(void* p) {
        free(p);
    }
};

std::unique_ptr<char, free_deleter> foo_str = foo();

答案 1 :(得分:1)

您可以从 char * 指针构造一个std :: string,但是std :: string将分配一个char数组本身。您仍然需要释放库中返回的char *:

char* c = foo();
std::string foo_str( c );
free( c );

您还可以创建一个函数来确保删除char *并返回一个std :: string:

std::string char_to_string_with_free( const char* c )
{
    std::string str( c );
    free( c );
    return str;
}

答案 2 :(得分:1)

AFAIK std :: string没有这样的构造函数,它拥有char*的所有权。无论如何,在库之外释放内存是一个坏主意,它被分配(如果我们谈论共享对象或DLL)。