2017-06-23 14 views
0

次のステートメントの結果はどうなりますか?C++での新しいキーワード/演算子の使用

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

新しいヒープ割り当てを作成しますか?それとも静的変数を置き換えるだけですか?それは次の点とどう違うのですか?

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

EDIT: ありがとうございます。うん、それは新しい配置のようです。

+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値を使用してである。

      既存のオブジェクトに代入文で使用される場合に10
    • 、それは、一時的なスタック(自動)メモリのブロックを割り当て、そのメモリ内に新しい一時std::stringオブジェクトを構築、pにその一時オブジェクトを割り当て、その後され一時オブジェクトを破棄し、一時メモリを解放します。

  • p = new std::string("New word");は、そのメモリにstd::stringオブジェクトを構築する、ヒープ(動的)メモリの新しいブロックを割り当て、その後pポインタのメモリアドレスを割り当てています。オブジェクトを手動deleteを使用して破壊されなければならない:すべての3つの場合において

    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'オブジェクト(または入力として 'std :: string'を受け入れる' operator = 'を持つオブジェクト)で、' std ::文字列* 'オブジェクトへのポインタ。 –

+0

これは私が求めていることです。 'std :: string p; ...; p = std :: string( "新しい単語"); '。これは一時的な文字列を作成し、それをコピーするか、またはelionをバイパスしますか? – Barmar

関連する問題