1

3 つの質問があります。

  1. 関数 f のスコープに割り当てられた A::str のメモリ。グローバル var vec の要素に移動した後、メモリ ブロックは f の範囲外でも安全ですか?

  2. 明示的に移動コンストラクターを与えない構造体 B の場合、構造体 A のようなデフォルトのものはありますか?

struct A
{
    A(const char* p):str(p){}
    A(const A&& a) : str(std::move(a.str))
    {
    }

    string str;
};

struct B
{
    B(const char* p):str(p){}

    string str;
};

vector<A>vec;

void f()
{
    vec.emplace_back(A("hello")); //in vc2010 it will invoke emplace_back(T&&)
}

int _tmain(int argc, _TCHAR* argv[])
{
    f();
    const char* p = vec[0].str.c_str();
    cout << p << endl;
    return 0;
}

3.そして、この危険な状況が STL コンテナーでは決して起こらないことを確認できますか?

struct String
{
    char* pStr; //allocate on heap
    int* someptr; //if point to allocate on stack 
    size_t len;

    String (const String&& s)
    {
    //  something like this:
        pStr = s.pStr;  //ok,safe
        len = s.len; 
        s.pStr = nullptr;

        someptr = s.someptr; //danger
    }
};
4

2 に答える 2

1
  1. 一時的な A オブジェクトに割り当てられたメモリがベクター要素に「移動」されるため、安全です。

  2. VC++ 2010 では、ムーブ コンストラクターは自動的に生成されませんが、C++11 標準が完成する前に VC++ 2010 がリリースされ、ムーブ コンストラクター/代入演算子の規則が多少変更されました。VC++ 2012 がそれらを生成するかどうかはわかりませんが、どちらにしても安全です (唯一の違いは、コピーまたは移動できることです)。

于 2013-03-14T07:06:29.800 に答える