代码可以工作,但在析构函数中崩溃(没有复制构造函数)
code works but crashes in destructor (without copy constructor)
基本上,我在做作业,我有一个链表,有多项式系数和指数。当没有包含copy c-tor时,代码在退出main(析构函数)时崩溃。对于copy c-tor,它不会发生,但我想知道为什么,因为我没有在任何地方显式地调用copy c-tor。这只是代码的一部分。Coef函数在列表中添加带有参数exp和Coef的节点,因此我认为不需要包含它。
CPList :: ~CPList ()
{
while (!isEmpty())
deleteFromHead();
}
void CPList :: deleteFromHead ()
{
CPNode* tmp=head;
if (head==tail)
head=tail=NULL;
else head=head->next;
delete tmp;
}
CPList* CPList :: mul (CPList p1, CPList p2)
{
CPList* res = new CPList;
CPNode *first, *second;
for (first=p1.head; first!=NULL; first=first->next)
for (second=p2.head; second!=NULL; second=second->next)
res->coef(first->exp+second->exp, first->coef*second->coef);
res->check();
return res;
}
它在这段代码之后,在右括号处崩溃。
int main ()
{
...
ptr=p3.mul(p1, p2);
ptr->printall();
}
当包含copy c-tor时正常工作
将p1
和p2
按值传递给mul
,因此创建副本并在mul
返回时销毁。
CPList* CPList :: mul (CPList p1, CPList p2) {//code}
当您按值传递并且没有实现默认复制构造函数时-创建对象的浅复制(这意味着简单地复制成员的所有值)
对于simple(内置类型),
但是,如果类中有成员,比如指针或引用&*,那么它们的值就会被复制,这就不好了,因为:
例如:
class A
{
A(){new m_pOnInt};
~A(){delete m_pOnInt};
int* m_pOnInt;
}
void someFunction(A objA);
当你调用someFunction(objA) -提供的A实例的临时副本被创建并压入堆栈,
在函数将控制权返回给调用者后,对堆栈中的所有对象调用函数析构函数,因此调用~objA();但是你仍然有一个类A的实例,它作为someFunction的参数提供,但是用无效的m_pOnInt作为删除操作符应用于它,所以当A的实例的析构函数被称为
解决方案使用"rule of 3":这意味着当你处理复杂的对象(包含像指针/引用这样的成员)时,实现特殊的成员函数:复制构造函数,赋值操作符,构造函数,这允许你执行深度复制。
相关文章:
- 如何修复条件复制期间发生的崩溃
- 复制赋值构造函数中的aligned_alloc内存块在释放时崩溃
- 程序崩溃在复制构造函数上
- 为什么在复制构造函数中分配联合成员会崩溃
- C++初始化复制构造函数中的列表赋值,并在复制构造函数中崩溃
- C :复制构造函数崩溃
- QT应用程序崩溃但不容易复制,我捕获了转储堆栈以及如何通过堆栈找到源代码
- 根据条件将元素从 std::vector 复制到 std::set 但它崩溃了
- 矢量未正确擦除内容(复制分配运算符的量运行直到崩溃 [BEX])
- 尝试复制数组时从 DLL 调用函数时程序崩溃
- 双向链表复制构造函数和程序崩溃
- 复制构造函数动机 - 为什么我的程序不崩溃?
- 复制数组 - 将数组加倍后崩溃
- 在类中复制和存储 LPTSTR 会导致崩溃
- 复制提升::跨线程崩溃的异常
- 复制特定类时崩溃
- 复制列表时光荣崩溃
- clang与gcc运行时的区别:用clang构建的c++类模板在没有复制构造函数的情况下崩溃,用复制构造函数构建的gcc
- visual String使用c++中的指针进行复制,在复制过程中程序崩溃
- 当绕过c++中的函数从目标进程的ExtTextOut复制数据字符串时,malloc会导致崩溃吗?