2

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

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

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

Visual Studio 也不断报告内存泄漏,我几乎将这与使用的字符串联系起来。

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

4

6 回答 6

8

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

char description[256] = {0};

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

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

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

于 2008-11-20T14:17:24.113 回答
8

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

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

于 2008-11-20T15:20:20.383 回答
4

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

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

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

*这不是真正的内存泄漏,但有些人说“内存泄漏”的意思是“内存不足”。在任何情况下,堆栈空间都比堆空间更有限,所以你必须注意你在那里使用的内存块的大小。

于 2008-11-20T13:54:59.120 回答
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) 不同。但你已经知道了。

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

于 2008-11-20T18:26:23.097 回答
3

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

于 2008-11-20T13:56:04.580 回答
1

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

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

为了清楚起见,我将其更改为“\ 0”。

于 2008-11-20T13:57:15.810 回答