C ++ std :: string * s;回忆记忆?

时间:2013-01-31 05:03:43

标签: c++ pointers memory stack heap

给定一个函数foo,其中包含一个语句:

void foo() {
  std::string * s;
}

此函数返回后是否回收了内存?

我假设是的,因为这个指针并没有指向任何东西,但有些人说不 - 这是一个悬垂的指针。

3 个答案:

答案 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 ++中的显式动态内存通常用于两种情况:

  • 您在编译时不知道对象的大小(通常使用未知大小的数组,如C字符串)
  • 您在编译时不知道对象的运行时类型(因为它的类将根据其他输入决定执行)

现在,std:string管理自己的第一点,并且不支持第二点(它没有虚拟方法),因此动态分配它不会增加任何值:它只是添加所有复杂性来管理自己的内存以包含字符串对象,它本身是包含其实际文本的其他内存的管理器。

答案 2 :(得分:0)

此代码只是创建一个指向内存中某处的指针,该指针包含字符串值,它指向之前已分配的某处,并且不分配新字符串。 它只是为指针值分配一个内存,在函数返回后它不再有效......