查询使用" char *" c ++中的变量

时间:2014-08-21 06:43:11

标签: c++ linux char

我在cpp代码中使用char *变量。我的查询是,我们应该使用new()或malloc()?

为char *变量分配内存
std::string str;
char* chrarray = NULL;
chrarray = str.c_str();

有人能说出上面的代码片段是否有内存泄漏?

使用这些变量应该是什么好习惯?

char* error;
error = dlerror();

我在dlopen的linux手册页中看到了上面的代码。为什么没有为错误变量分配内存?

3 个答案:

答案 0 :(得分:3)

当您分配内存或承担先前分配的内存的责任时,您有内存泄漏,并且在您不再需要时无法取消分配此内存。

在您的示例中,您接收到已分配结构的指针,但您不承担释放该内存的责任。

c_str()的情况下,你得到一个指向字符串内部存储器的指针。如果该字符串超出范围并被销毁,则该指针不再有效。它不需要被释放,因为你不拥有它。可能有其他事情使指针失效,所以在使用这样的指针时你需要非常小心。

更好的方法是:

const char* chrarray = str.c_str();

无需初始化指向NULL的指针,然后立即将其重新写入其他内容。

第二种情况描述了许多旧的C库中会发生什么,它们将返回指向您不拥有的共享内存的指针。其中一些不是线程安全的,因为所有线程都将引用相同的块,因此在接收指针时请仔细阅读文档。如果你要承担它的所有权,你将不得不使用正确的方法销毁,否则你将泄漏。

答案 1 :(得分:0)

你还没有在这个片段中分配任何内存,所以我猜不出内存泄漏的问题

std::string str;
char* chrarray = NULL;
chrarray = str.c_str();

以下是man page为dlerror()

所说的内容
  

dlerror获得()

     

函数dlerror()返回描述符号的可读字符串   dlopen(),dlsym()或dlclose()发生的最新错误   自上次调用dlerror()以来。如果没有错误,则返回NULL   自初始化或最后一次调用以来发生的。

这意味着,在使用dlerror时无需分配内存,该字符串将返回给您。但是,如果返回的值为NULL,则需要注意

答案 2 :(得分:0)

std::string str;
char* chrarray = NULL;
chrarray = str.c_str();

不包含内存泄漏。 chrarray将指向字符串的内部数据(无论它现在是否为空),并且很可能在对字符串进行修改后无法信任它。

char* error;
error = dlerror();

会将error变量初始化为dl*函数族的最后一个错误。除非您忘记正确关闭您使用的动态库,否则应该没有内存泄漏...除非您遇到Memory leak reported by valgrind in dlopen?

中发现的情况