c++ - 为什么对象在插入集合后会被删除?

标签 c++ c++11

我已经设置了这个例子:

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 在程序结束时被删除时,对象会被破坏一次。但是对象被删除了两次:

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

为什么 set.insert 在这里创建一个拷贝?

最佳答案

set 中的对象不同于 create() 的本地对象。 set 中的那些是使用复制构造函数和移动构造函数构造的,而不是构造函数 UsefulClass(int),因此您看不到它们的构造。当函数 create() 返回时,局部对象被销毁,然后 set 中的对象在 main 结束后的全局清理中被销毁。

关于c++ - 为什么对象在插入集合后会被删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17065620/

相关文章:

c++ - 如何有效使用Boost的intrusive_ptr?

c++ - 如何在 0 个可变参数上专门化可变参数模板类?

c# - Emgucv 有 BackgroundSubtractorMOG 和 BackgroundSubtractorMOG2 吗?

c++ - Qt 正在获取对 YouTube api 的请求,不支持 utf8 字符

c++ - 在读取数据文件时,如何找到用户输入的字符串的变位词?

c++ - 下面的代码中这个方括号有什么用?

c++ - 如何使用 libcurl 保存图像

c++ - 从数组初始化 QVector

c++ - 我怎样才能创建 vector 的直方图<vector<long>>

c++ - 如果大括号闭合列表的类构造函数大小错误,则编译时错误