2

この例を設定しました:

class UsefulClass {
public: 
        int id;
        const bool operator< (const UsefulClass &other) const {
                return this->id > other.id;
        }
        UsefulClass(int _id): id(_id) {
                std::cout << "constructing " << id << std::endl;
        }
        ~UsefulClass() {
                std::cout << "destructing " << id << std::endl;
        }
};
std::set<UsefulClass> set;
void create() {
        UsefulClass object_1(1);
        UsefulClass object_2(2);
        set.insert(object_1);
        set.insert(std::move(object_2));

        std::cout << "create end" << std::endl;
}
int main() {
        create();
        std::cout << "main end" << std::endl;
}

setプログラムの最後にオブジェクトが削除されると、オブジェクトが一度破壊されることを期待しています。ただし、オブジェクトは 2 回削除されます。

constructing 1
constructing 2
create end
destructing 2
destructing 1
main end
destructing 1
destructing 2

set.insertここでコピーを作成するのはなぜですか?

4

5 に答える 5

1

あなたのケースには 3 のルールが適用されます。dtor から印刷して意味のあるトレースが必要な場合は、ctor もコピー (および移動) する必要があります。

これを行うと、出力が意味を成し、物事が適切にペアリングされるはずです。

于 2013-06-12T12:41:18.047 に答える
0

誰もが私の前に言ったことを説明するために、この単純な例を作成してください (セットが使用する新しいコピー コンストラクターを使用し、グローバル変数を使用してid、コンストラクターが実行されるたびに異なる を生成します --- テスト済みなので、ファイルに入れてコンパイルできます):

#include <iostream>
#include <string>
#include <set>

using namespace std;

class UsefulClass {
    static int instance;
public:
    int id;
    int i;

    const bool operator<(const UsefulClass &other) const {
        return id < other.id;
    }

    UsefulClass(int i){
        id = instance++;
        this->i = i;
        cout    << "constructing "
            << id
            << ":"
            << this->i
            << endl;
    }

    UsefulClass(const UsefulClass& other) {
        id = instance++;
        i = other.i;
        cout    << "constructing "
            << id
            << ":"
            << i
            << endl;
    }

        ~UsefulClass(){
        cout    << "destructing "
            << id
            << ":"
            << i
            << endl;
    }
};

int UsefulClass::instance = 0;

std::set<UsefulClass> myset;

void create() {
        UsefulClass object_1(1);
        UsefulClass object_2(2);
        myset.insert(object_1);
    /* please, explain what you mean with std::move, or which move
     * have you used for the next statement.  All i have is
     * std::move(... ) for strings, but you have not defined
     * string UsefulClass::operator string();
     */
        myset.insert(/*std::move*/(object_2));

        cout    << "create end"
        << endl;
}

int main() {
        create();
        cout    << "main end"
        << std::endl;
}

そのため、UsefulClass オブジェクトを作成するたびに異なるインスタンス ID を取得し、セットに挿入すると、それらが新しいインスタンスとしてコピーされていることがわかります。各オブジェクトがいつ作成され、いつ削除されるかがわかります。

$ pru
constructing 0:1
constructing 1:2
constructing 2:1
constructing 3:2
create end
destructing 1:2
destructing 0:1
main end
destructing 2:1
destructing 3:2
于 2014-08-22T08:07:21.380 に答える