C++:在被本地字符串捕获后释放或销毁 malloc 的 char *?

标签 c++ memory-management c-strings

假设我执行以下操作:

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/

相关文章:

c++ - 关于C++对象序列化技术的建议

c++ - 具有模板参数enable_if的C++ friend 功能

ios - OpenCV 代码导致 UIImages 泄漏

c - 如何在不使用动态内存分配的情况下将字符指针填充到另一个指针中

c - 为什么在写入使用字符串文字初始化的 "char *s"而不是 "char s[]"时出现段错误?

c++ - 如何访问 C++ 中的实例变量,如 Objective-C getter 和 setter

ios - UIImagePicker 相机内存警告阻止图像被设置为 UIImageView

c - 在c中初始化字符串数组的不同方法

在 malloc 期间转换 size_t 以在 c 中初始化 char* 数组

C++ 常量表达式和数组界限