繁体   English   中英

如何处理在C / C ++中返回的动态内存的指针

[英]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::stringstd::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM