c++ - 潜在的内存泄漏?

标签 c++ c string memory-leaks

以下代码解决了去除字符串中重复字符的问题。

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/

相关文章:

c++ - 当仅提供一些模板参数时,C++编译器如何推断模板参数

c++ - 错误 : class "" has no member named ""? 是否可以解决此特定情况?

typescript - 从 Typescript 类型中提取信息

铿锵: compiling with non-flat x86 stack model

c++ - 奇怪的算法性能

c++ - 如何将字符串转换为 LPTSTR

c++ - GMP有理数如何序列化?

C++ 多重继承,与派生对象中基类的地址混淆

c - "dereferencing"这个词是从哪里来的?

c - 在 HP-UX 上使用 libunwind 并获取堆栈跟踪