假设我执行以下操作:
char *get_data(...) {
char *c_style = (char *) malloc(length * sizeof(char));
load_c_string_with_my_c_function(c_style, length, input);
return c_style;
}
int main() {
std::string data(get_data(...));
// free(data.c_str()); ?? -- are the malloc'd bytes now managed?
return 0;
}
有什么方法可以释放get_data()
分配的内存吗?注释的 free(data.c_str());
会起作用吗?
最佳答案
一旦你这样做
std::string data(get_data(...));
无法取回 get_data()
返回的指针,因此您会泄漏该内存。要解决此问题,只需首先让 get_data()
返回一个 std::string
,这样您根本不必担心内存管理。那会给你
std::string get_data(...) {
std::string data(length, '\0');
load_c_string_with_my_c_function(data.data(), length, input); // requires C++17
// load_c_string_with_my_c_function(&data[0], length, input); // use this for pre-C++17 compilers
return data;
}
现在没有内存泄漏。如果你不能这样做那么你需要捕获指针,用它来初始化字符串,然后像释放指针一样
char* ret = get_data(...);
std::string data(ret);
free(ret);
关于C++:在被本地字符串捕获后释放或销毁 malloc 的 char *?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52874739/