3

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

char* getText();

我想知道这在系统中实际上是如何工作的。在我的getText function中,我通过alloc to a char*. 然后,我只是通过该函数返回它。

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

4

2 回答 2

2

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

为了在这种特定情况下更直接地回答您的问题,如果您可以保证在使用完 free() 后收到它,那么您将不会发生内存泄漏。但是,如果您忘记 free() 接收然后重新分配要接收的内容,则认为存在内存泄漏。您丢失了您负责释放的资源的句柄,并且无法再释放它。

通常,您的代码非常类似于 C,而不是 C++ 的做事方式。返回 std::string 会更像 C++。关于动态分配, malloc() 和 free() 也是动态分配的“C方式”。new 和 delete 是 C++ 进行动态分配的方式。

于 2013-06-15T15:13:22.030 回答
2

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

但是如果你想返回一个指针(换句话说,你想返回一个字符串的“句柄”,而不是字符串本身),考虑使用智能指针而不是原始指针。智能指针是无泄漏的,因为它的内存量是基于RAII的。返回原始指针的问题是您的函数接口没有指定谁将解除分配字符串。调用者,还是函数使用的经理/工厂?

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

智能指针的要点是您不必担心字符串生命周期/内存大小

于 2013-06-15T15:29:44.283 回答