繁体   English   中英

内存泄漏与内存分配

[英]Memory leaking with memory allocation

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作为参数或只是创建自己。 我想我不知道重要的事情,但我不知道那是什么......

要理解句子片段的意思“只会泄漏内存,因为des是一个局部变量” ,就必须理解上下文。 没有明确说明的是局部变量的值绝不会在其他地方复制。

如果该值丢失,则分配被泄露。

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

当在此处指定的值: des = new char[src.size() + 1]; 如果没有传递给函数的外部,则在函数结束时无条件地泄漏。

返回值时,可能会在以后删除它,从而避免泄漏。

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

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

首先,des是局部变量,但它是指针变量,你分配(src.size()+ 1)大小的内存,所以它在你的进程的堆内存中分配。

查看这个网站

http://www.cplusplus.com/doc/tutorial/dynamic/

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

然后在本地分配内存,然后此功能负责解除分配。 如果你归还它,那么你把这个责任推给别人,这很危险。 您将遇到与您的功能相同的问题,但在其他地方:

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!
}

使用此编译器将始终记住释放此内存。

在这种特定情况下,您可以使用barry建议的 std::string 在某些情况下,我甚至使用std::vecotr作为字符串。 所有这些都取决于这种“记忆”的用法。 当你需要做很多字符串操作(如连接)时, std::string是最好的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM