繁体   English   中英

擦除Char []

[英]Erasing a Char[]

好吧,我正在研究别人的代码。 他们做了很多这样的事情:

char description[256];
description[0]=0;

我知道这会在字符数组的第一个位置放置\\ 0。 但这甚至是一种擦除字符串的安全方法吗?

视觉工作室也会报告内存泄漏,我几乎把这个完成与使用的字符串联系起来。

PS。 是的我知道std :: string,是的,我使用它。 这不是我的代码。

要将字符串初始化为0,您可以执行以下操作:

char description[256] = {0};

这将为数组的每个元素分配0。

将第一个元素设置为0'\\0' )不会删除它的内容。 它甚至不保证整个字符串被设置为空字符。

正如其他人所说,在函数关闭之前,当它被放弃时,你不能“擦除”静态创建的对象。 从技术上讲,当函数被放弃时它也不会被删除 - 堆栈指针只是被改变了。 如果你对被删除的数据感到偏执,你应该遍历数组,将每个条目设置为0'\\0' )。

将char数组的第一个元素设置为\\ 0就足以确保'description'是一个格式正确的实际字符串。 元素1到255都可以是垃圾,只要元素0为0,描述就是零长度字符串。

你不必担心上面发布的代码中的内存泄漏,因为数组是在堆栈上分配的。 一旦它从堆栈中掉落(超出范围),char数组就会被释放。

这个字符串是在堆栈上分配的,所以没有办法释放它使用的内存,直到它调用的函数返回(当它自动发生时)。 除非你以递归方式调用此函数*,否则这将无法成为内存泄漏,因为一旦函数返回,该空间将用于将来的堆栈帧。 如果你担心安全性,你应该循环并将字符串的元素清零。

如果你想要一个free() - 内存块,你可以执行以下操作并在堆上分配数组:

char *str = malloc(256*sizeof(char)); // str now is a pointer to a 256-char array
...
// some code here
...
free(str); // free the memory

*这不是一个实际的内存泄漏,但有些人说“内存泄漏”,当他们的意思是“内存不足”。 在任何情况下,堆栈空间比堆空间更受限制,因此您必须观察在那里使用的内存块的大小。

澄清到目前为止给出的好答案:

  • 是的,description [0] = 0从strxxx函数中清除字符串POW:strlen(description)== 0,strcmp(description,“”)== 0和std :: string(description)==“”都是真的。

  • 不,description [0] = 0与free(description)或memset(description,0,sizeof description)不同。 但你已经知道了。

  • 你引用的那段代码不可能导致内存泄漏。 内存没有在堆上分配,内存泄漏是一堆事情。

\\0放在字符串的第一个元素中是一种清除字符串的安全方法,但这与删除字符串不同,并且不会阻止内存泄漏。

如果它是一个char []字符串,并且对它执行的唯一操作是字符串函数,那很好。 当然,它对受保护的数据来说还不够好。

至于内存泄漏,可能值得更改为字符串函数的安全版本,但是你不能泄漏静态或基于堆栈的字符串,所以它可能是你的字符串被传递出去的地方。

为清楚起见,我将其更改为'\\ 0'。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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