2012-03-07 73 views
0

我正在用std::vector来保存一些具有动态分配成员的对象,当我将事物放入向量中时,发生了一些我不了解的事情。C++矢量问题

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

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

我不确定哪些代码段与此问题相关,因为所讨论的行在方法中是非常根深蒂固的。

编辑:代码添加

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. 
    } 
}; 
+0

你可以发表包含push_back()的行吗?我怀疑你正在将一个对象复制到向量中,因此创建,复制并破坏了一个对象(因此调用析构函数) – 2012-03-07 21:58:07

+0

为什么你不显示实际的代码?我不相信您的散文描述与术语准确地匹配,因为术语看起来有点......未定义 – sehe 2012-03-07 21:58:36

+0

在push_back过程中,vector类允许使用其复制构造函数创建对象的副本,然后其中一些副本可能会被销毁并且它们的析构函数会被调用。你有一个有效的复制构造函数给你的类吗? – 2012-03-07 21:59:34

回答

3

第一:我叫的push_back()和使用的对象作为参数的构造函数,但由于某种原因它关系到该对象的析构函数。为什么是这样;它应该添加不删除?

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

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

很奇怪的是,这发生在第二个电话,但最终vector需要再次重新长出它复制元素时。

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

+0

很高兴提及'emplace_back'以避免副本 – sehe 2012-03-07 22:02:39

+0

@sehe:但是我没有提到它,因为OP没有使用** C++ 11 **。随意编辑我的问题添加它。 – 2012-03-07 22:06:23

1

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

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

如果它是第一个,然后当你打电话push_back()你创建一个新对象的本地副本,矢量使得副本在矢量存储,然后你暂时离开范围并遭到破坏。

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

+0

向问题添加代码 – gardian06 2012-03-07 22:15:40