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