我的硬件代码中有一个函数,它返回一个char *:
char* getText();
我想知道这实际上是如何在系统中运行的。在我的getText function
中,我通过alloc to a char*
分配了一个内存空间。然后,我只是通过该函数返回它。
现在,我有另一个函数通过调用char* receive=getText()
来检索这个函数,并在使用它后删除了receive。我可以检查一下这是否会导致内存泄漏吗?
答案 0 :(得分:2)
由于我假设您使用GCC进行编译的Linux系统,您可以使用valgrind来运行程序并保证找到任何泄漏,甚至可能发生可能发生的内存泄漏。
要在这种特定情况下更直接地回答您的问题,如果您可以保证在完成使用后免费()接收,那么您将不会有内存泄漏。但是,如果您忘记free()接收然后重新分配要接收的内容,那么就会考虑内存泄漏。您已经丢失了负责释放的资源的句柄,并且无法再释放它。
通常,您的代码非常类似于C而不是C ++的处理方式。返回一个std :: string会更像C ++。关于动态分配,malloc()和free()也是进行动态分配的“C方式”。 new和delete是进行动态分配的C ++方式。
答案 1 :(得分:2)
正如人们建议的那样,使用std::string
而不是类似C的字符串。 std::string
自动管理自己的内存,并具有丰富而安全的界面。字符串默认是可移动的,因此按值返回不会有任何性能损失。
但是如果你想返回一个指针(换句话说,你想要为字符串返回一个“句柄”,而不是字符串本身),考虑使用智能指针而不是原始指针。智能指针是无泄漏的,因为它的内存镶嵌基于RAII。 返回原始指针的问题是函数的接口没有指定谁将解除分配字符串。调用者,或函数使用的经理/工厂?
如果使用unique_ptr作为返回类型,则指定在调用者停止使用其句柄时将删除结果字符串。另一方面,如果使用shared_ptr,则指定该字符串由函数使用的内部管理器/工厂管理。
智能指针的要点是 你不必担心字符串生命周期/记忆魔法 。