C++ 内存分配导致内存泄漏

C++ 内存分配导致内存泄漏,c++,dynamic,memory-leaks,C++,Dynamic,Memory Leaks,​ 关于这个问题,我还有一个问题。 回答者说第一个 des=新字符[src.size()+1]; 会导致内存泄漏,因为des是一个局部变量,所以他马上提出了另一种方法 char*toNormalWord(const std::string&src) { char*des=新字符[src.size()+1]; //东西 返回des; } 但是我不明白为什么局部变量会导致内存泄漏,以及第一个变量和第二个变量之间的区别。 第二个函数是否也将des用作函数中的局部变量? 我认为区别在于函数将des作

​ 关于这个问题,我还有一个问题。 回答者说第一个

des=新字符[src.size()+1];
会导致内存泄漏,因为des是一个局部变量,所以他马上提出了另一种方法

char*toNormalWord(const std::string&src)
{
char*des=新字符[src.size()+1];
//东西
返回des;
}
但是我不明白为什么局部变量会导致内存泄漏,以及第一个变量和第二个变量之间的区别。 第二个函数是否也将
des
用作函数中的局部变量? 我认为区别在于函数将des作为参数接收,或者只是创建它们自己。
我想我不知道一些重要的事情,但我不知道那是什么…

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

查看此网站


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

如果值丢失,则分配会泄漏

第一个和第二个有什么区别

当在此处指定值时:
des=new char[src.size()+1]未与函数外部通信,分配将在函数结束时无条件泄漏

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

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

对。区别在于它的值是否返回。

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\u ptr

std::unique\u ptr toNormalWord(const std::string&src)
{
std::unique_ptr des(新字符[src.size()+1]);
/* ... */
返回des;
}
void processString(const std::string和src)
{
std::unique_ptr des=toNormalWord(src);
/* ... */
如果(c=='\n')抛出新的std::exception(“无效字符!”);//没有内存泄漏!
/* ... */
return;//没有内存泄漏!
}
使用此编译器,编译器将始终记住释放此内存

在这种特定情况下,您可以使用
std::string
。在某些情况下,我甚至对字符串使用
std::vecotr
。所有这些都取决于“内存”的用途。
std::string
在您需要执行大量字符串操作(如连接)时是最佳选择。

在哪里调用
delete[]
内存?导致内存泄漏的原因是在代码中的某个点未使用
delete[]
。根据链接中给出的答案,使用
std::string
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!
}