内存分配导致的内存泄漏

4

C++错误:无法访问地址0x1

我对这个问题有一个额外的疑问。 回答者说第一个错误

des = new char[src.size() + 1];

这段代码会导致内存泄露,因为des是一个局部变量,所以他建议在这之后使用另一种方法。

char* toNormalWord(const std::string& src)
{
   char* des = new char[src.size() + 1];
   // stuff
   return des;
}

但是我不明白为什么局部变量会导致内存泄漏,以及第一个和第二个有什么区别。 难道第二个函数中也不是使用des作为局部变量吗? 我原本以为两者之间的区别就在于函数是否接收des为参数或自行创建。 我想我是缺少了一些重要的知识,但我不知道具体是什么。


你在哪里调用delete []释放内存?如果代码中缺少使用delete [],就会导致内存泄漏。采纳链接中的答案建议--使用std::string - PaulMcKenzie
3个回答

2
为了理解句子片段“will just leak memory, since des is a local variable”的含义,必须了解上下文。未明确说明的是,局部变量的值没有被复制到其他地方。
如果该值丢失,则会泄漏分配。

第一个和第二个之间有什么区别。

当此处分配的值:des = new char[src.size() + 1];未传达给函数外部时,分配将无条件泄漏到函数末尾。
当该值被返回时,它可能会被稍后删除,从而避免泄漏。

第二个不也在函数中使用des作为局部变量吗?

是的。不同之处在于其值是否被返回。

0

0

eerorika answer是正确的,但可以扩展。

然后分配内存局部,然后这个函数的责任是解除分配。 如果您返回它,则将此责任推给其他人,这是危险的。您将在另一个地方遇到与您的函数相同的问题:

char* toNormalWord(const std::string& src);

void processString(const std::string& src)
{
    char* des = toNormalWord(src);
    /* ... */
    if (c == '\n') throw new std::exception("invalid character!"); //memory leak of `des`!
    /* ... */
    return; //memory leak of `des`!
}

现在你的内存已经局限于其他函数,应该在那里释放。

避免所有这些的最好方法可能是使用 std::unique_ptr<char[]>

std::unique_ptr<char[]> toNormalWord(const std::string& src)
{
    std::unique_ptr<char[]> des(new char[src.size() + 1]);
    /* ... */
    return des;
}

void processString(const std::string& src)
{
    std::unique_ptr<char[]> des = toNormalWord(src);
    /* ... */
    if (c == '\n') throw new std::exception("invalid character!"); //no memory leak!
    /* ... */
    return; //no memory leak!
}

使用这个编译器将始终记得释放这个内存。

在这种特定情况下,您可以使用std::string如Barry所建议的。在某些情况下,我甚至使用std::vector来处理字符串。所有这些都取决于对这个“内存”的使用方式。 当您需要执行大量字符串操作(如连接)时,std::string是最好的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接