以下声明的结果是什么?
std::string p;
new (&p) std::string("New word");
是否会创建新的堆分配?或者它只是替换静态变量?它与以下内容有何不同?
p = std::string("New word");
p = new std::string("New word");
编辑: 多谢你们。是的,它似乎是一个新的位置。
答案 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
的位置分配,它采用的优化等等。