我必须使用一个库函数,为生成的字符串分配一些内存并返回char*
,期望调用者最终使用free()
释放内存。
// Example declaration of the library function:
char* foo();
// ...
// Example usage:
auto foo_str = foo();
// ...
free(foo_str);
是否可以从此指针构造std::string
,将内存的所有权传递给字符串对象,以便在字符串被销毁时释放它?我知道我可以实现我自己的包装器来提供这种RAII行为,但我猜这个轮子已经发明了一次。
答案 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)。