【问题标题】:C++ std::string* s; Memory reclaimed?C++ std::string* s;内存回收了?
【发布时间】:2013-01-15 03:26:55
【问题描述】:

给定一个带有语句的函数 foo:

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

这个函数返回后内存回收了吗?

我假设是,因为这个指针没有指向任何东西,但有些人说不——它是一个悬空指针。

【问题讨论】:

  • 为什么还要创建指向字符串的指针?您是否熟悉 RAII 以及 std::string 如何管理其内存?

标签: c++ pointers memory heap-memory stack-memory


【解决方案1】:

std::string* s 只是一个未初始化的指向字符串的指针。当函数 foo 返回时指针将被销毁(因为指针本身是分配在堆栈上的局部变量)。从未创建过std::string,因此不会有任何内存泄漏。

如果你说

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

那你就会有内存泄漏

【讨论】:

  • 谢谢!这证实了我对这种简单情况的看法。
  • "只是一个未初始化的指向将要被销毁的字符串的指针" -- 这句话有点模棱两可。什么会被摧毁?指针?还是不存在的字符串?
  • @BenjaminLindley:如何摧毁不存在的东西?
  • @EdS。答案没有明确说明该字符串不存在。那是我的话。
  • "std::string s 只是一个未初始化的指向字符串的指针。"* - 看起来很清楚。如果 OP 不了解已初始化变量和未初始化变量之间的区别,那么他现在应该从指针中退后一步。还有 "没有创建 std::string,因此不会有任何内存泄漏。"
【解决方案2】:

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

【讨论】:

  • 你在说什么标点符号他是对的,代码只是创建了一个指向内存中某处的指针,但他错了,因为还没有分配内存,所以它在技术上不是一个悬空指针,因为指针没有'还没有分配给任何东西。
  • @thang:缺少标点符号,看原帖。
【解决方案3】:

当人们了解字符串 a-la C,然后通过 C 习语开始使用 C++ 时,此代码是典型的。

C++ 类(尤其是标准库类)将对象视为,并自行管理所需的内存。

std::string,在这个意义上与int 没有区别。如果您需要一个“文本容器”,只需声明一个 std::string (不是std::string*)并相应地对其进行初始化(未初始化的 std::strings 根据定义为空 - 和默认构造函数),而不是使用它来形成表达式使用方法,运算符和相关函数,就像您对其他简单类型所做的那样。

std::string* 本身就是设计不良环境的症状。

C++ 中的显式动态内存通常用于两种情况:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 2023-02-23
    • 1970-01-01
    • 2016-03-17
    • 2011-03-26
    • 2011-08-06
    • 1970-01-01
    相关资源
    最近更新 更多