在C ++中使用新的关键字/运算符

时间:2017-06-23 21:16:06

标签: c++

以下声明的结果是什么?

std::string p;
new (&p) std::string("New word");

是否会创建新的堆分配?或者它只是替换静态变量?它与以下内容有何不同?

p = std::string("New word");
p = new std::string("New word");

编辑: 多谢你们。是的,它似乎是一个新的位置。

1 个答案:

答案 0 :(得分:2)

  • new (&p) std::string("New word");正在使用展示位置&p必须指向预先存在的内存块,其大小至少为sizeof(std::string)个字节。 std::string对象将在该内存中构建,而不是在新分配的内存块中构建。必须通过在使用它时直接调用其析构函数来销毁该对象,例如:

    char buffer[sizeof(std::string)];
    std::string *p = new (buffer) std::string("New word");
    ...
    p->~std::string();
    
  • p = std::string("New word");可能会做不同的事情,具体取决于使用它的上下文:

    • 如果在变量声明语句中使用,p在堆栈(自动)或堆(动态)内存(取决于上下文)上分配,并使用std::string值进行复制构造:

      some_type p = std::string("New word");
      //
      // same as:
      // some_type p(std::string("New word"));
      //
      // if some_type=std::string, same as:
      // std::string p("New word");
      ...
      
    • 如果在预先存在的对象的赋值语句中使用,它将分配一个临时堆栈(自动)内存块,在该内存中构造一个新的临时std::string对象,分配该临时对象到p,然后摧毁临时对象并释放临时记忆。

  • p = new std::string("New word");正在分配一个新的堆(动态)内存块,在该内存中构造std::string对象,然后将内存地址分配给p指针。必须使用delete

    手动销毁对象
    std::string *p = new std::string("New word");
    ...
    delete p;
    

在所有三种情况下,std::string对象都包含指向其字符数据的内部指针,该指针可指向堆栈上的内存(自动)或堆(动态),具体取决于std::string的位置分配,它采用的优化等等。