复制特定类时崩溃
Crash when copy a particular class
我有一个非常复杂的类,它有一个另一个类的向量。我报告一个更简单的,无论如何它都有我能够找到的问题。
// the inner class
class DuffyDuck{
int isblack; // 0 is white, 1 is black
int n_duck;
vector<DuffyDuck> * point_Duck;
public:
DuffyDuck(int isblack):isblack(isblack){
}
void set_point(vector<DuffyDuck> & Abitants){
point_Duck=&Abitants;
}
};
// the complessive class
class DuckCity{
vector<DuffyDuck> DuckAbitants;
public:
DuckCity(int numwhite,int numblack){
for(int i=0;i<(numblack+numwhite);++i){
DuckAbitants.push_back(DuffyDuck(i>=numblack));
DuckAbitants[i].set_point(DuckAbitants);
}
}
};
现在这行得通了(我在几个函数中使用point_Duck),但是如果我在示例中调用它"(*point_Duck)[2].n_duck;"之后执行类似操作,则项目崩溃。
只有当我这样做时,才会发生这种情况:
DuckCity LittleTown(0,0);
LittleTown=DuckCity(3,5);
并且在使用一些调用指针的函数之后。
如果我直接做小城(3,5),一切都很好。
我希望我解释得足够好。
DuffyDuck
类存储DuckCity
的vector<>
成员的地址。因此,当您将DuckCity
复制到其他实例时,该新实例将具有不同的vector<>
实例。但是,该向量中的每个DuffyDuck
实例仍具有旧DuckCity
实例的地址。
因此,您复制到littleTown
会产生悬而未决的指针。
我建议您重新考虑DuffyDuck
的设计,或者为DuckCity
实现一个赋值运算符,该运算符对vector<>
的每个元素执行深度复制。如果实现赋值运算符,请记住还要遵循三法则。
问题的原因是每个DuffyDuck都有一个指向DuffyDuck向量的指针。当类被销毁时,引用将变为无效 -->崩溃。
DuckCity littleTown(1,2); // this creates a duck city
// with each duck pointing to the DuckAbitans vector.
littleTown=DuckCity(3,5); // this initializes another instance (call it INST)
// of DuckCity and
// then it assigns (via = operator) the value to littleTown
// by **copying** the DuffyDuck structures into a newly
// allocated vector. This makes the pointer of each DuffyDuck
// invalid after INST is destroyed (as it is a temporary object)
当你复制Abitants
的地址时,你是在获取DuckCity(3,5)
创建的临时对象中的向量地址。然后将这个临时对象复制到littleTown
中,并销毁原始对象。这意味着您的原始Abitats
指针指向未使用的内存,这反过来又会导致崩溃。
很难确切地说你应该如何解决这个问题 - 可能是通过拥有一个"重建"Abitats
指针的复制构造函数。
相关文章:
- 如何修复条件复制期间发生的崩溃
- 复制赋值构造函数中的aligned_alloc内存块在释放时崩溃
- 程序崩溃在复制构造函数上
- 为什么在复制构造函数中分配联合成员会崩溃
- C++初始化复制构造函数中的列表赋值,并在复制构造函数中崩溃
- C :复制构造函数崩溃
- QT应用程序崩溃但不容易复制,我捕获了转储堆栈以及如何通过堆栈找到源代码
- 根据条件将元素从 std::vector 复制到 std::set 但它崩溃了
- 矢量未正确擦除内容(复制分配运算符的量运行直到崩溃 [BEX])
- 尝试复制数组时从 DLL 调用函数时程序崩溃
- 双向链表复制构造函数和程序崩溃
- 复制构造函数动机 - 为什么我的程序不崩溃?
- 复制数组 - 将数组加倍后崩溃
- 在类中复制和存储 LPTSTR 会导致崩溃
- 复制提升::跨线程崩溃的异常
- 复制特定类时崩溃
- 复制列表时光荣崩溃
- clang与gcc运行时的区别:用clang构建的c++类模板在没有复制构造函数的情况下崩溃,用复制构造函数构建的gcc
- visual String使用c++中的指针进行复制,在复制过程中程序崩溃
- 当绕过c++中的函数从目标进程的ExtTextOut复制数据字符串时,malloc会导致崩溃吗?