C++ C+上的双自由错误+;复制构造函数

C++ C+上的双自由错误+;复制构造函数,c++,pointers,C++,Pointers,我在这段代码上有一个双重免费或损坏(fasttop)错误。 我想我错过了“复制构造函数”中的某些内容 上述=运算符不调用复制构造函数。为什么? 上面写着:“双重自由或腐败(fasttop)”和 a = Vector(12) 有几件事正在发生: 首先创建一个新的临时Vector对象(从Vector(12))。这是使用向量(int)构造函数构造的 class Vector{ int taille; int* ptr; public: Vector():taille(0)

我在这段代码上有一个双重免费或损坏(fasttop)错误。 我想我错过了“复制构造函数”中的某些内容

上述=运算符不调用复制构造函数。为什么?

上面写着:“双重自由或腐败(fasttop)”

a = Vector(12)
有几件事正在发生:

  • 首先创建一个新的临时
    Vector
    对象(从
    Vector(12)
    )。这是使用
    向量(int)
    构造函数构造的

  • class Vector{
    
        int taille;
        int* ptr;
    
    public:
        Vector():taille(0), ptr(NULL){
            ...
        }
    
        Vector(int n){
            ...
        }
    
        //The most important one
        Vector(const Vector& source){
            if(source.ptr != NULL){
                taille = source.taille;
                ptr = new int[taille];
                for(int i=0;i<taille;i++) ptr[i]=source.ptr[i];
            }else{
                taille=0;
                ptr=NULL;
            }
            cout << "Copy constructor" << endl;
        }
    
        ~Vector(){
            if(ptr!=NULL) delete ptr;
        }
    };
    
  • 使用
    a.operator=()
    将临时对象分配给
    a

    默认编译器生成的
    operator=
    函数执行简单的成员赋值,即它基本上执行
    ptr=other.ptr
    。这意味着您现在有两个对象
    ptr
    成员指向同一内存:临时对象和
    a

  • 分配完成后,临时对象将被销毁。这意味着该对象占用的内存被传递到
    delete
    (实际上应该是
    delete[]

    这当然意味着
    a.ptr
    不再指向有效内存,当它随后超出范围并被破坏时,您尝试
    删除已删除的内存

  • 这里没有复制施工。都是复印作业。复制构造仅在创建对象(临时或非临时)时用于实际构造。我想您会感到困惑,因为
    =
    符号可以用于复制构造,如中所示

    Vector a = b;  // This is a copy-construction
                   // The copy-constructor of `a` is called with
                   // a reference to `b` as argument
                   // It's equal to `Vector a(b)`
    
    这和作业很不一样

    a = b;  // This is a plain assignment
            // It is equal to `a.operator=(b)`
    

    通过以下方法之一解决了碰撞问题

    我还建议您阅读带有表达式的,例如..

    a = Vector(12)
    
    有几件事正在发生:

  • 首先创建一个新的临时
    Vector
    对象(从
    Vector(12)
    )。这是使用
    向量(int)
    构造函数构造的

  • class Vector{
    
        int taille;
        int* ptr;
    
    public:
        Vector():taille(0), ptr(NULL){
            ...
        }
    
        Vector(int n){
            ...
        }
    
        //The most important one
        Vector(const Vector& source){
            if(source.ptr != NULL){
                taille = source.taille;
                ptr = new int[taille];
                for(int i=0;i<taille;i++) ptr[i]=source.ptr[i];
            }else{
                taille=0;
                ptr=NULL;
            }
            cout << "Copy constructor" << endl;
        }
    
        ~Vector(){
            if(ptr!=NULL) delete ptr;
        }
    };
    
  • 使用
    a.operator=()
    将临时对象分配给
    a

    默认编译器生成的
    operator=
    函数执行简单的成员赋值,即它基本上执行
    ptr=other.ptr
    。这意味着您现在有两个对象
    ptr
    成员指向同一内存:临时对象和
    a

  • 分配完成后,临时对象将被销毁。这意味着该对象占用的内存被传递到
    delete
    (实际上应该是
    delete[]

    这当然意味着
    a.ptr
    不再指向有效内存,当它随后超出范围并被破坏时,您尝试
    删除已删除的内存

  • 这里没有复制施工。都是复印作业。复制构造仅在创建对象(临时或非临时)时用于实际构造。我想您会感到困惑,因为
    =
    符号可以用于复制构造,如中所示

    Vector a = b;  // This is a copy-construction
                   // The copy-constructor of `a` is called with
                   // a reference to `b` as argument
                   // It's equal to `Vector a(b)`
    
    这和作业很不一样

    a = b;  // This is a plain assignment
            // It is equal to `a.operator=(b)`
    

    通过以下方法之一解决了碰撞问题


    我还建议您阅读,例如:

    您正在分配
    a=Vector(12)
    中创建一个临时
    向量,该向量通过
    操作符=
    分配给
    a
    。临时
    向量
    在赋值语句末尾被销毁,而
    a
    在函数末尾被销毁。由于您没有定义复制分配
    运算符=
    ,所以这两个值都指向同一个已分配数组:


    您正在分配
    a=Vector(12)
    中创建一个临时
    向量,该向量通过
    操作符=
    分配给
    a
    。临时
    向量
    在赋值语句末尾被销毁,而
    a
    在函数末尾被销毁。由于您没有定义复制分配
    运算符=
    ,所以这两个值都指向同一个已分配数组:


    使用
    删除[]
    新建[]
    。不是
    delete
    。您也没有实现
    operator=()
    问题实际上不是复制构造函数,而是复制赋值。我建议你了解一下(我个人推荐最后一个)。@MohammedAit你使用的是
    delete
    ,它与
    delete[]
    不同。你已经编辑了你的问题,现在它变得模棱两可。是关于坠机的事吗?为什么会发生?或者是关于为什么作业与复制构造不同?请澄清。请使用
    delete[]
    new[]
    。不是
    delete
    。您也没有实现
    operator=()
    问题实际上不是复制构造函数,而是复制赋值。我建议你了解一下(我个人推荐最后一个)。@MohammedAit你使用的是
    delete
    ,它与
    delete[]
    不同。你已经编辑了你的问题,现在它变得模棱两可。是关于坠机的事吗?为什么会发生?或者是关于为什么作业与复制构造不同?请澄清。求你了,你太棒了!请和我分享一些你读过的关于编程的最好的书。我读过“工程师编程——学习C和Matlab的基本方法”,我很喜欢。谢谢你太棒了!请和我分享一些你读过的关于编程的最好的书。我读过“工程师编程——学习C和Matlab的基本方法”,我很喜欢。谢谢