2017-06-23 76 views
0

以下語句的結果是什麼?在C++中使用新的關鍵字/運算符

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

它是否創建一個新的堆分配?或者它只是取代靜態變量?它與以下內容有什麼不同?編輯: 謝謝你們。是的,它似乎是一個新的安置。

+5

如果您發佈了「p」的定義,問題會更有意義。 –

+1

另請參閱:https://stackoverflow.com/questions/8918791/how-to-properly-free-the-memory-allocated-by-placement-new/8918942#8918942 –

+0

可能是一個愚蠢的https:// stackoverflow .com/q/13370935/10077,雖然我很猶豫要捶打它。 –

回答

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"); 
      ... 
      
    • 如果在預先存在的對象的賦值語句中使用,它將分配一塊臨時堆棧(自動)內存,在該內存中構造一個新的臨時對象,將該臨時對象分配給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的分配位置,它採用的優化方式等。

+0

'p = std :: string(「New word」);那不是初始化一個新變量? – Barmar

+0

可以編譯的唯一方法是,如果'p'是一個實際的'std :: string'對象(或者一個帶'operator ='的對象接受'std :: string'作爲輸入的對象),而不是'std ::字符串*'指向一個對象的指針。 –

+0

這就是我所問的,例如'std :: string p; ...; p = std :: string(「新單詞」);'。這是否會創建一個臨時字符串並複製它,或者複製elision繞過? – Barmar