返回一个char指针(内存泄漏)

Return a char pointer (memory leak)

本文关键字:指针 内存 泄漏 char 一个 返回      更新时间:2023-10-16

我的硬件代码中有一个函数,它返回一个char*:

char* getText();

我想知道这在系统中是如何工作的。在getText function中,我通过alloc to a char*分配了一个内存空间。然后,我简单地通过该函数返回它。

现在,我有另一个函数通过调用char* receive=getText()来检索它,并且我在使用它后删除了receive。我可以检查这是否会导致内存泄漏吗?

因为我假设您是在使用GCC进行编译的linux系统上,您可以使用valgrind来运行您的程序,并保证找到任何存在的泄漏甚至可能发生的内存泄漏。

在这个特定的情况下更直接地回答你的问题,如果你能保证你的free()在你使用它之后接收,那么你就不会有内存泄漏。但是,如果您忘记free() receive,然后重新分配一些东西给receive,那么就会被认为是内存泄漏。您已经丢失了您负责释放的资源的句柄,并且无法再释放它。

一般来说,你的代码非常像C,而不是c++的做事方式。返回std::string会更像c++。关于动态分配,malloc()和free()也是执行动态分配的"C方式"。new和delete是c++实现动态分配的方法。

正如人们建议的那样,使用std::string而不是c类字符串。std::string自动管理自己的内存,并具有丰富和安全的接口。String在默认情况下是可移动的,因此按值返回不会有任何性能损失。

但是如果你想返回一个指针(换句话说,你想返回一个"句柄"到字符串,而不是字符串本身),考虑使用智能指针而不是原始指针。智能指针是无泄漏的,因为它的内存管理基于RAII。返回原始指针的问题是,函数的接口没有指定谁将释放该字符串。调用者,还是由函数使用的管理器/工厂?

如果使用unique_ptr作为返回类型,则指定当调用者停止使用其句柄时将删除结果字符串。另一方面,如果使用shared_ptr,则指定该字符串由函数使用的内部管理器/工厂管理。

智能指针的意义在于您不必担心字符串生命周期/内存占用