std :: pair和类的析构函数

可能重复:
什么是三项规则?

std::pair如何为其组件调用析构函数? 我正在尝试向std::map添加一个类的实例,但是我得到了有关我的类的析构函数的错误。

我已经将我的问题缩小到以下非常简单的例子。

下面, my_class只是在构造时创建一个int数组,并在销毁时删除它。 不知何故,我得到一个“双删除”的错误:

//my_class.h
class my_class {
  public:
    int an_int;
    int *array;

    //constructors:
    my_class()
    {
      array = new int[2];
    }
    my_class(int new_int) : an_int(new_int)
    {
      array = new int[2];
    }

    //destructor:
    ~my_class()
    {
      delete[] array;
    }
};  //end of my_class

同时,在main.cpp中...

//main.cpp
int main(int argc, char* argv[])
{
  std::map<int, my_class>   my_map;

  my_map.insert( std::make_pair<int, my_class> (1, my_class(71) ) );

  return 0;
} // end main

编译进行得很好,但是这会产生以下运行时错误:

*** glibc detected *** ./experimental_code: double free or corruption (fasttop):

或者,用valgrind:

==15258== Invalid free() / delete / delete[] / realloc()
==15258==    at 0x40249D7: operator delete[](void*) (vg_replace_malloc.c:490)
==15258==    by 0x8048B99: main (my_class.h:38)
==15258==  Address 0x42d6028 is 0 bytes inside a block of size 8 free'd
==15258==    at 0x40249D7: operator delete[](void*) (vg_replace_malloc.c:490)
==15258==    by 0x8048B91: main (my_class.h:38)

(因为我删除了评论和内容,因此行号已关闭)

我必须错过关于std::pair东西...?

感谢所有提前!


当你添加my_class到stl容器时,复制构造函数被调用。 由于您没有定义一个它会执行成员复制,并且会创建两个指向同一个int数组的my_class对象,当这些对象被删除时,同一个int数组可能会被删除两次

请看看三的规则

如果您担心效率问题,在C ++ 11中也会查看移动构造函数


你的类通过定义一个没有拷贝构造函数和赋值操作符的析构函数来违反三条规则。 一旦你定义了这些,你的代码应该运行OK:STL容器很大程度上依赖于这些,所以你应该问问自己,你是否每次使用类作为STL容器的模板参数都实现了全部三个。


你必须定义一个合适的拷贝构造函数,因为你的类的拷贝通过指针的复制实例共享同一个数组。

链接地址: http://www.djcxy.com/p/73171.html

上一篇: std::pair and class destructors

下一篇: When do we need to define destructors?