我在cpp代码中使用char *变量。我的查询是,我们应该使用new()或malloc()?
为char *变量分配内存std::string str;
char* chrarray = NULL;
chrarray = str.c_str();
有人能说出上面的代码片段是否有内存泄漏?
使用这些变量应该是什么好习惯?
char* error;
error = dlerror();
我在dlopen的linux手册页中看到了上面的代码。为什么没有为错误变量分配内存?
答案 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?