释放内存以避免内存泄漏

时间:2014-07-06 08:12:20

标签: visual-c++ memory memory-leaks

我发现了一些内存泄漏的地方,但我无法弄清楚如何修复它们。在某些情况下我使用new创建本地Char *但是我需要使用delete来取消分配范围内的内存(正确?)。我在几个地方添加了这个,但我仍然得到内存泄漏。我还创建了一个函数,它将整个char *转换为小写,并创建另一个临时char *来保存它,然后在函数结束时返回它。因为我要归还它,我应该在哪里删除它? (我知道我在这里得到了内存泄漏)

ToLower funcion:

char * item::ToLower(char * source)
{
    int length = strlen(source) + 1;
    char * dest = new char[length + 1];

    for (int index = 0; index < length; ++index)
    {
        if (source[index] == ' ')
            dest[index] = ' ';
        else
            dest[index] = tolower(source[index]);
    }
    return dest;
}

另一个问题: 在这个赋值中,instuctor说每个方法(函数)应该只返回一个,并且我们使用的是bool返回类型。我以为每条路都应该有回报,这不是真的吗?最后回报是否更好?任何建议或想法都会有所帮助。

1 个答案:

答案 0 :(得分:0)

当返回分配的原始指针时,你实际上是在这个函数的调用者身上放弃了删除的责任(不清楚你是在编写只在你内部使用的代码还是可能有一些第三方用户)。

如果您只是在内部使用它,那么在您使用它的那一刻就应该delete

如果你正在写一些可供他人使用的东西,那么你只能很好地问他们并希望最好。

如果您可以更改方法签名,我建议您根据需要使用unique_ptrshared_ptr

此外,如果您不打算以任何方式更改source,请使用const char * const source

std::unique_ptr<char[]> ToLower2(const char * const source)
{
    int length = strlen(source) + 1;
    char * dest = new char[length + 1];
    for (int index = 0; index < length; ++index)
    {
        if (source[index] == ' ')
            dest[index] = ' ';
        else
            dest[index] = tolower(source[index]);
    }
     return std::unique_ptr<char[]>(dest);
}

您可以看到示例here(它也适用于VS2010)。

关于退货的子问题,你是正确的“所有路径”应该有一个return(当然除非它是一个void函数,它可以没有),一个{{1}更多的是一种风格,对某些人来说更方便,而对其他人则更少。