以下代码解决了去除字符串中重复字符的问题。
void removeDuplicatesEff(char *str)
{
if (!str)
return;
int len = strlen(str);
if (len < 2)
return;
const int sz = (1<<CHAR_BIT);
bool hit[sz] = {false};
int tail = 0;
for (int i=0; i<len; ++i)
{
if (!hit[str[i]])
{
str[tail] = str[i];
++tail;
hit[str[i]] = true;
}
}
str[tail] = 0;
}
在上一步设置str[tail]=0
后,如果char *str
确实包含重复的字符,那么它的大小会变小,即tail
。但是我想知道这里是否有内存泄漏?在我看来,后来,我们无法释放分配给原始 char *str
的所有空间。这是正确的吗?如果是这样,在这种情况下我们该如何解决?
最佳答案
It seems to me that, later, we cannot releasing all the spaces that is allocated to original char *str. Is this right?
没有。以零结尾的字符串的长度与分配的内存缓冲区的大小完全无关,系统将其分开处理。只要每个分配后跟一个对称的释放(例如,每个 malloc
操作都有一个 free
),你就是安全的。
But I am wondering whether there is a memory leak here?
可以说,是的,这仍然是一个泄漏,因为它(暂时)使用了比所需更多的内存。但是,这通常不是问题,因为内存最终会被释放。因此,除非在非常特殊的情况下,否则这不会被视为泄漏。
也就是说,代码非常不合常规,而且绝对比必要的要长(它还假设 CHAR_BIT == 8
但那是另一回事)。例如,您可以更轻松地初始化标志数组,从而节省一个循环:
bool hit[256] = {false};
为什么你的循环从一个开始遍历字符串,为什么第一个字符单独处理?
关于c++ - 潜在的内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21021712/