代码之家  ›  专栏  ›  技术社区  ›  Jan Rüegg

重新分配C++字符串,是否正确释放旧字符串?

  •  4
  • Jan Rüegg  · 技术社区  · 14 年前

    class Phone {
    string name;
    
    void foo()
      {
        name = string("new_name");
      }
    }
    

    • 现在,我在Phone-to-string的构造函数中初始化字符串(“old\u name”)。这和以前的空字符串情况相同吗?旧字符串“old\u name”在这里发生了什么?
    4 回复  |  直到 14 年前
        1
  •  9
  •   In silico    14 年前

    对, std::string 为您管理内存。(这就是它存在的原因之一!)它如何做到这一点是一个实现细节(例如,它可能使用写时拷贝、引用计数或深度拷贝语义),但在大多数情况下, 如果不再需要内存,将始终正确释放内存。

    当然,这是假设赋值运算符或的析构函数的实现中没有错误 标准::字符串 (对于实现非默认赋值运算符/析构函数的所有类都是如此)。

        2
  •  3
  •   Kornel Kisielewicz    14 年前

    如果是的话 std::string

    另外请注意,您的代码的作用与:

    name = "new_name";
    

    ... 更明确地说:

    name.assign( "new_name" );
    
        3
  •  1
  •   James Curran    14 年前
    • 假设赋值运算符已正确写入,则会调用析构函数。
        4
  •  1
  •   dirkgently    14 年前

    旧的空字符串怎么了?“释放”正确吗?它还占用内存吗?

    可以 重新分配到。你要做的是:

    • 创建一个临时字符串对象,该对象在指定结束时释放 ;
    • name 变量。

    现在我初始化 字符串(“旧名称”)。这是一样的吗 和之前的空字符串一样? 这根旧绳子怎么了 “旧名字”?

    视情况而定。如果你使用的是初始化列表,那么不,它是不同的。没有赋值;只调用复制构造函数。