std :: move触发析构函数?

问题描述 投票:1回答:3

我正在使用参数为const vector<pair<int32_t, A>>& as的接口。

为了避免多重构造和多重破坏,我将CreateAs编写如下。

我期望它分别触发一次createmovedel,但是原来触发了movedel两次。

  • 是什么原因?
  • 我这样做是为了使A对象可以自动销毁自己,即使有new但没有delete。我做对了吗?

要再现它:https://repl.it/@unix1/ShrillFirsthandAdvance

#include <iostream>
#include <vector>

using namespace std;

struct A {
    A() { cout << "A()" << endl; }
    A(int32_t a) : a_(a) { cout << "Create A: " << a << endl; }
    A(const A& oa) { a_ = oa.a_; cout << "Copy A: " << oa.a_ << endl; }
    A(A& oa) { a_ = oa.a_; cout << "Copy A non-const: " << oa.a_ << endl;  }
    A(const A&& oa) { a_ = oa.a_; cout << "Move A: " << oa.a_ << endl; }
    A(A&& oa) { a_ = oa.a_; cout << "Move A non-const: " << oa.a_ << endl; }
    ~A() { cout << "Del A: " << a_ << ", ptr: " << this << endl; }

    int32_t a_;
};

void CreateAs(vector<pair<int32_t, A>>& as) {

    as.reserve(3);
    for (int32_t i = 0; i < 3; ++i) {
        A* a = new A(i*i);
        cout << "a ptr: " << &a << endl;
        cout << "-----before insert----" << endl;
        as.emplace_back(make_pair(i, move(*a)));
        cout << "-----after insert-----" << endl;
    }
}

void Test() {
    vector<pair<int32_t, A>> as;
    cout << "-----Create begin----" << endl;
    CreateAs(as);
    cout << "-----Create end------" << endl;
    for (const auto& item : as) {
        cout << item.first << "->" << item.second.a_ << endl;
    }
}

int main(int32_t argc, char* argv[]) {
    Test();
    cout << "____end test____" << endl;
    return 0;
}

c++ c++11 stl
3个回答
1
投票

make_pair成对构成Aemplace_backpairA移动到向量中。从pair中移出的内容被销毁,同时还破坏了所包含的A


0
投票

为了避免采取任何行动,您可以这样做


0
投票

此代码中有几个问题。这里有一些解释:

© www.soinside.com 2019 - 2024. All rights reserved.