我正在使用std::vector
来保存一些动态分配成员的对象,当我将这些东西放入向量时,我发现了一些我不理解的事情。
我调用push_back()
并使用对象的构造函数作为参数,但由于某种原因,它会转到对象的析构函数。为什么是这样;应该添加不删除?
我第二次打电话给push_back()
和以前一样,但这次它会在dbgdel.cpp
操作员删除时抛出非法的内存访问(第52行)。但是永远不应该在构造函数中调用delete,或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 :(得分: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()
时,您正在创建新对象的本地副本,该向量会将副本存储在向量中,然后再临时一个留下范围并被破坏。
至于第二次,我猜你的类不是为了正确处理副本而编写的,所以临时实例中的析构函数会删除一些内容,但副本仍引用相同的指针。然后当它由于某种原因被删除时(或者你的新人因某种原因引用同一个东西)它会中断。很难说没有看到你班级的代码。