c ++矢量问题

时间:2012-03-07 21:54:39

标签: c++ vector

我正在使用std::vector来保存一些动态分配成员的对象,当我将这些东西放入向量时,我发现了一些我不理解的事情。

  1. 我调用push_back()并使用对象的构造函数作为参数,但由于某种原因,它会转到对象的析构函数。为什么是这样;应该添加不删除?

  2. 我第二次打电话给push_back()和以前一样,但这次它会在dbgdel.cpp操作员删除时抛出非法的内存访问(第52行)。但是永远不应该在构造函数中调用delete,或push_back()

  3. 我不确定哪个代码段与此问题相关,因为有问题的行在方法中非常根深蒂固。

    编辑:已添加代码

    class Thing{
        int** Array;
        int size;   // of square array
        Point current; // location
        Thing(int _n){
            // allocates, and gives values to the array, and members
            // only constructor
        }
    };
    class ThingMgr{
        Thing * Control;
        Thing * Current;
        Thing * Previous;
        int size;  // size of all. same use as in Thing
        ThingMgr(int _n){
            size = _n;
            Control = new Thing(size);
            Current = new Thing(size);
            Previous = new Thing(size);
        }
        void rearrange(int _num){
            std::vector<Thing> possibles;
    
            // performs deterministic work on members
    
            // [0] first
            possibles.push_back(Thing(size)); // this succeeds
            // [1] second
            possibles.push_back(Thing(size)); // this fails
    
            // more operations to be performed never reached.
        }
    };
    

2 个答案:

答案 0 :(得分:3)

  

首先:我调用push_back()并使用对象的构造函数作为参数,但由于某种原因,它会转到对象的析构函数。为什么是这样;应该添加不删除?

您正在将该元素的副本推送到vector。构造一个时间元素,调用其复制构造函数在vector内创建一个副本,然后调用temporal元素的析构函数。

  

第二:我第二次调用push_back(),和之前一样,但是这次它会在dbgdel.cpp operator delete(第52行)中抛出非法的内存访问。但是永远不应该在构造函数或push_back()中调用delete。

奇怪的是,这发生在第二次调用时,但最终当vector需要重新生成时,它会再次复制元素。

您可能无法为相关元素提供正确的复制构造函数。

答案 1 :(得分:1)

您是在向量中存储指针,还是将其复制到其中?例如,是吗:

class MyClass;
vector<MyClass> my_vector;
//or
vector<MyClass*> my_vector;

如果是第一个,那么当您调用push_back()时,您正在创建新对象的本地副本,该向量会将副本存储在向量中,然后再临时一个留下范围并被破坏。

至于第二次,我猜你的类不是为了正确处理副本而编写的,所以临时实例中的析构函数会删除一些内容,但副本仍引用相同的指针。然后当它由于某种原因被删除时(或者你的新人因某种原因引用同一个东西)它会中断。很难说没有看到你班级的代码。