[英]How to deal with pointers to dynamic memory being returned in C/C++
我想知道处理内存泄漏的协议,指向动态内存的指针是在C和C ++中返回的。 例如,strtok返回char *。 据推测,最终返回的指针必须被释放/删除。 我注意到参考页面甚至没有提到这一点。 这是因为这是假设吗? 另外,您如何知道是删除还是免费? 是否需要进行研究以找出每个函数最初所使用的语言,然后假设所有C程序都使用malloc / free而C ++使用new / delete?
strtok不会返回指向新分配的内存的指针,而是返回先前已分配的内存位置的指针。
我们假设这个:
char String[1024];
strcpy(String, "This is a string");
char *Ptr = strtok(String, " ");
Ptr不会指向新分配的内存位置,而是指向String的位置(如果我的计数现在没有让我失败),空格将被替换为'\\ 0'。 (
从引用开始:令牌的这一端由函数自动替换为空字符,并且函数返回令牌的开头。
这也意味着,如果你在strtok完成其工作后再次打印出'String',它将只包含'This',因为字符串在此之后终止。
根据经验,您可以安全地说,您只需要释放/删除您自己明确分配的内存。
这意味着:
对于每个'新'放一个'删除',并为每个'malloc'放一个'免费',你就是好的。
strtok
是一个C函数,它返回一个指向以前分配的内存的指针; strtok
本身不分配新的内存。
如果用malloc
分配了一些东西,它必须free
释放; 用new分配的任何东西都必须是带delete
free
d。
在现代C ++中处理内存分配/释放的最佳方法是使用智能指针。 看看std::shared_ptr
/ std::unique_ptr
并且不要使用原始指针,除非你绝对必须这样做。
同样使用std::string
和std::vector
将删除大部分原始指针。
strtok
函数不执行任何内存分配。 它正在对您提供的字符串指针执行操作。 在调用函数时,您应该已经考虑过是否为堆上的指针分配内存或使用自动堆栈存储。 你可以写:
char * p = "Testing - string";
char * p2 = strtok(p, "- ");
这里p2没有被释放/删除,因为它是在堆栈上分配的。 但在这儿
char * p = "Testing - stringh";
char * p2 = malloc(strlen(p));
p2 = strtok(p, "- ");
你已经在堆上为p2分配了存储空间,所以在你完成它之后它必须被释放并设置为null:
if(p2 != NULL) {
free(p2);
p2 = NULL;
}
因此,如果您使用new进行堆分配,则使用delete; 如果你使用malloc / calloc,你应该免费使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.