【发布时间】:2014-01-09 13:33:30
【问题描述】:
以下代码解决了去除字符串中重复字符的问题。
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 的所有空间。这是正确的吗?如果是这样,在这种情况下我们该如何解决?
【问题讨论】:
-
我有一个问题,可能是一个愚蠢的问题,但我不明白你到底在用大小为 256 的数组做什么?它代表什么?
-
@Kraken 作为哈希表,记录
char *中每个元素出现的频率。 -
@herohuyongto 是的,但为什么是 256?不应该是128吗?
-
@Kraken 通过考虑Extended ASCII Codes 来处理
€。 -
@herohuyongtao 是的,C 标准要求
CHAR_BIT在<limits.h>中定义为char表示中的位数。它必须至少为 8,但理论上没有最大尺寸(N1570(C11 之前的草案)§5.2.4.2.1/1)。并且符号常量总是在可读性方面优于幻数。
标签: c++ c string memory-leaks