以下語句的結果是什麼?在C++中使用新的關鍵字/運算符
std::string p;
new (&p) std::string("New word");
它是否創建一個新的堆分配?或者它只是取代靜態變量?它與以下內容有什麼不同?編輯: 謝謝你們。是的,它似乎是一個新的安置。
以下語句的結果是什麼?在C++中使用新的關鍵字/運算符
std::string p;
new (&p) std::string("New word");
它是否創建一個新的堆分配?或者它只是取代靜態變量?它與以下內容有什麼不同?編輯: 謝謝你們。是的,它似乎是一個新的安置。
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");
...
如果在預先存在的對象的賦值語句中使用,它將分配一塊臨時堆棧(自動)內存,在該內存中構造一個新的臨時對象,將該臨時對象分配給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
的分配位置,它採用的優化方式等。
如果您發佈了「p」的定義,問題會更有意義。 –
另請參閱:https://stackoverflow.com/questions/8918791/how-to-properly-free-the-memory-allocated-by-placement-new/8918942#8918942 –
可能是一個愚蠢的https:// stackoverflow .com/q/13370935/10077,雖然我很猶豫要捶打它。 –