好的我正在研究别人的代码。他们做了很多这样的事情:
char description[256];
description[0]=0;
我知道这会在字符数组的第一个位置放置\ 0。但这甚至是一种擦除字符串的安全方法吗?
此外,visual studio还会报告内存泄漏情况,而且我已将此操作与使用的字符串联系起来。
聚苯乙烯。是的我知道std :: string,是的,我使用它。这不是我的代码。
答案 0 :(得分:8)
要将字符串初始化为0,您可以执行以下操作:
char description[256] = {0};
将为数组的每个元素指定0。
将第一个元素设置为0
('\0'
)不会删除它的内容。它甚至不能保证整个字符串都设置为空字符。
正如其他人所说,在功能关闭之前,当它被放弃时,你不能“擦除”静态创建的对象。从技术上讲,当函数被放弃时它也不会被删除 - 堆栈指针只是被改变了。如果您对要删除的数据感到偏执,则应遍历数组,将每个条目设置为0
('\0'
)。
答案 1 :(得分:8)
将char数组的第一个元素设置为\ 0足以确保'description'是格式正确的实际字符串。元素1到255都可以是垃圾,只要元素0为0,描述就是零长度字符串。
您不必担心上面发布的代码中的内存泄漏,因为数组是在堆栈上分配的。一旦它从堆栈中掉落(超出范围),char数组就会被释放。
答案 2 :(得分:4)
这个字符串是在堆栈上分配的,所以没有办法释放它使用的内存,直到它调用的函数返回(当它自动发生时)。除非你以递归方式调用此函数*,否则这将无法成为内存泄漏,因为一旦函数返回,该空间将用于将来的堆栈帧。如果你担心安全性,你应该循环并将字符串的元素清零。
如果你想要一个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
*这不是一个实际的内存泄漏,但有些人说“内存泄漏”,当他们的意思是“内存不足”。在任何情况下,堆栈空间都比堆空间更有限,因此您必须观察在那里使用的内存块的大小。
答案 3 :(得分:4)
澄清到目前为止给出的好答案:
是的,description [0] = 0从strxxx函数清除字符串POW:strlen(description)== 0,strcmp(description,“”)== 0和std :: string(description)== “”都是真的。
不,description [0] = 0与free(description)或memset(description,0,sizeof description)不同。但你已经知道了。
您引用的一段代码不可能导致内存泄漏。内存未在堆上分配,内存泄漏是一堆堆。
答案 4 :(得分:3)
将\0
放在字符串的第一个元素中是清除字符串的安全方法,但这与删除字符串不同,并且不会阻止内存泄漏。< / p>
答案 5 :(得分:1)
如果它是一个char []字符串,并且对它执行的唯一操作是字符串函数,那很好。当然,它对受保护的数据来说还不够好。
至于内存泄漏,可能值得更改为字符串函数的安全版本,但是你不能泄漏静态或基于堆栈的字符串,所以它可能是你的字符串被传递出去的地方。
为清楚起见,我将其更改为'\ 0'。