2

渡されたときに STL コンテナーが完全にコピーされるかどうかはわかりませんでした。まず、うまくいきました (そのため、"フラッターシャイ" 要素が追加されませんでした。これは良かったです)。次に、エントリの構築と破壊を追跡したいと思いました....

#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
using namespace std;

int nextid = 0;

class Entry {
public:
    string data;
    int myid;
    Entry(string in) {
        data = in;
        myid = nextid;
        nextid++;
        printf("Entry%02d\n", myid);
    }
    ~Entry() { printf("~Entry%02d\n", myid); }
};

class Meep {
public:
    vector<Entry> stuff;
};

void think(Meep m) {
    m.stuff.push_back(Entry(string("fluttershy")));
}

int main() {

    Meep a;
    a.stuff.push_back(Entry(string("applejack")));
    think(a);
    vector<Entry>::iterator it;
    int i = 0;
    for (it=a.stuff.begin(); it!=a.stuff.end(); it++) {
        printf("a.stuff[%d] = %s\n", i, (*it).data.c_str());
        i++;
    }

    return 0;
}

次の予期しない出力が生成されます ( http://ideone.com/FK2Pbp ):

Entry00
~Entry00
Entry01
~Entry00
~Entry01
~Entry00
~Entry01
a.stuff[0] = applejack
~Entry00

a要素は 1 つしかないと予想されますが、それは問題ではありません。私をひどく混乱させているのは、どうすれば 1 つのエントリを複数回破棄できるのでしょうか?

4

1 に答える 1

4

あなたが見ているのは、一時的なインスタンスの破壊です。

a.stuff.push_back(Entry(string("applejack")));

この行は、コンテナー内の別の新しいインスタンスにコピーされる一時的なインスタンスを作成します。その後、一時的なものは破棄されます。エントリが削除されるか、コンテナが破棄されると、コンテナ内のインスタンスが破棄されます。

于 2013-02-11T15:27:01.333 に答える