C++ 试图理解为什么多重映射会像它那样构造/解构

C++ 试图理解为什么多重映射会像它那样构造/解构,c++,constructor,destructor,multimap,C++,Constructor,Destructor,Multimap,我先把所有地址打印出来给你。我想理解的是,为什么它在当时被分配。我用一个字符串和一个对象构造了一个多重映射,在这个对象的构造函数和析构函数中,当调用它们时,我有一个打印输出 第一个问题:它正在复制对象吗? 第二个问题:为什么我看到的析构函数比构造函数多? 第三个问题:我从来没有得到任何构造函数中列出的地址,我们在下面看到的最后5个 感谢您帮助我理解multimap中的构造/破坏 奥利弗 std::multimap <string, TestObject> m; for(in

我先把所有地址打印出来给你。我想理解的是,为什么它在当时被分配。我用一个字符串和一个对象构造了一个多重映射,在这个对象的构造函数和析构函数中,当调用它们时,我有一个打印输出

第一个问题:它正在复制对象吗? 第二个问题:为什么我看到的析构函数比构造函数多? 第三个问题:我从来没有得到任何构造函数中列出的地址,我们在下面看到的最后5个

感谢您帮助我理解multimap中的构造/破坏

奥利弗

    std::multimap <string, TestObject> m;

for(int i = 0; i < 5 ;i++){

    TestObjectone("test", i);

    m.insert(pair<string, TestObject>(("a" + i), one));
    cout << "Single Iteration" <<  i << endl;

}
参数构造函数test0 0x22ff24 析构函数称为TestObject:test0 0x22ff08 析构函数称为TestObject:test0 0x22ff18 单次迭代0 析构函数称为TestObject:test0 0x22ff24 参数构造函数test1 0x22ff24 析构函数称为TestObject:test1 0x22ff08 析构函数称为TestObject:test1 0x22ff18 单次迭代1 析构函数称为TestObject:test1 0x22ff24 参数构造函数test2 0x22ff24 析构函数称为TestObject:test2 0x22ff08 析构函数称为TestObject:test2 0x22ff18 单次迭代2 析构函数称为TestObject:test2 0x22ff24 参数构造函数test3 0x22ff24 析构函数称为TestObject:test3 0x22ff08 析构函数称为TestObject:test3 0x22ff18 单次迭代3 析构函数称为TestObject:test3 0x22ff24 参数构造函数test4 0x22ff24 析构函数称为TestObject:test4 0x22ff08 析构函数称为TestObject:test4 0x22ff18 单次迭代4 析构函数称为TestObject:test4 0x22ff24

析构函数称为TestObject:test4 0x482f6c 析构函数称为TestObject:test3 0x482efc 析构函数称为TestObject:test0 0x482dd4 析构函数称为TestObject:test2 0x482e8c 析构函数称为TestObject:test1 0x482e1c

第一个问题: 是的,STL容器有一个语义值,您的对象被复制

第二个问题: 可能是因为复制构造函数没有调试打印。如果您尚未实现自己的定制复制ctr,则将使用默认的复制ctr

第三个问题: 您可以看到复制构造对象的析构函数调用,正如jkrok在注释中提到的第一个问题: 是的,STL容器有一个语义值,您的对象被复制

第二个问题: 可能是因为复制构造函数没有调试打印。如果您尚未实现自己的定制复制ctr,则将使用默认的复制ctr

第三个问题:
您可以看到复制构造对象的析构函数调用,正如jkrok在注释中提到的那样。对于第三个问题,您可以添加:最后5个析构函数是在m中插入时复制构造的对象,在m超出范围时调用。因此multimap将执行memcpy,然后调用析构函数,我问,因为我没有复制构造函数,我会假设复制内存块将是默认的复制构造函数?当你看着水流的时候behaviour@OliverStutz:编译器为类生成的复制构造函数将为其所有成员调用复制构造函数。在您的例子中,它将为string和TestObject调用复制ctor。这是正确的做法;您不能使用memcpy字符串。@mAlters感谢您的澄清,我假设它可以使用memcpy,因为如果在自定义类中添加指针而不使用任何复制功能,则浅层复制的效果是可见的,但我相信它不会递归执行,奥利弗:编译器生成的复制cor递归地做,但是在C++中复制指针是浅的。对于类内外的指针都是这样。对于第三个问题,您可以添加:最后5个析构函数是在m中插入时复制构造的对象,在m超出范围时调用。因此multimap将执行memcpy,然后调用析构函数,我问,因为我没有复制构造函数,我会假设复制内存块将是默认的复制构造函数?当你看着水流的时候behaviour@OliverStutz:编译器为类生成的复制构造函数将为其所有成员调用复制构造函数。在您的例子中,它将为string和TestObject调用复制ctor。这是正确的做法;您不能使用memcpy字符串。@mAlters感谢您的澄清,我假设它可以使用memcpy,因为如果在自定义类中添加指针而不使用任何复制功能,则浅层复制的效果是可见的,但我相信它不会递归执行,奥利弗:编译器生成的复制cor递归地做,但是在C++中复制指针是浅的。对于类内外的指针都是这样。