给定一个函数foo,其中包含一个语句:
void foo() {
std::string * s;
}
此函数返回后是否回收了内存?
我假设是的,因为这个指针并没有指向任何东西,但有些人说不 - 这是一个悬垂的指针。
答案 0 :(得分:10)
std::string* s
只是指向字符串的未初始化指针。当函数foo返回时,指针将被销毁(因为指针本身是在堆栈上分配的局部变量)。没有创建std::string
,因此您不会有任何内存泄漏。
如果你说
void foo() {
std::string * s = new std::string;
}
然后你会有内存泄漏
答案 1 :(得分:1)
当人们了解字符串a-la C,然后开始使用C ++到C语言时,这段代码很典型。
C ++类(特别是标准库类)将对象视为 values ,并自行管理所需的内存。
std::string
,在这个意义上与int
没有什么不同。如果你需要一个“文本容器”,只需声明一个std :: string(不是std::string*
)并相应地初始化它(未初始化的std :: strings按定义为空 - 和默认构造函数),而不是使用它来形成表达式像你这样的方法,运算符和相关函数将使用其他简单类型。
std :: string *本身就是设计环境恶劣的症状。
C ++中的显式动态内存通常用于两种情况:
现在,std:string管理自己的第一点,并且不支持第二点(它没有虚拟方法),因此动态分配它不会增加任何值:它只是添加所有复杂性来管理自己的内存以包含字符串对象,它本身是包含其实际文本的其他内存的管理器。
答案 2 :(得分:0)
此代码只是创建一个指向内存中某处的指针,该指针包含字符串值,它指向之前已分配的某处,并且不分配新字符串。 它只是为指针值分配一个内存,在函数返回后它不再有效......