Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 赋值重载显式调用析构函数(在执行其他二进制重载运算符之后)_C++_Operator Overloading_Destructor_Dynamic Arrays - Fatal编程技术网

C++ 赋值重载显式调用析构函数(在执行其他二进制重载运算符之后)

C++ 赋值重载显式调用析构函数(在执行其他二进制重载运算符之后),c++,operator-overloading,destructor,dynamic-arrays,C++,Operator Overloading,Destructor,Dynamic Arrays,我的问题很简单(double-free或corruption(fasttop)),有一个解决方案()。但是,我无法实现它。我不知道问题出在哪里。当我跟踪我的程序时,我看到它发生在二进制运算符执行之后。。。 例如, arr1=arr2+arr3 执行此语句后,它调用析构函数。所以,我的析构函数将调用作用域的末尾,以便调用它的次数超过要求。 我的班级定义是 class IntArray { public: IntArray(int size); //IntArray(const In

我的问题很简单(double-free或corruption(fasttop)),有一个解决方案()。但是,我无法实现它。我不知道问题出在哪里。当我跟踪我的程序时,我看到它发生在二进制运算符执行之后。。。 例如,

arr1=arr2+arr3

执行此语句后,它调用析构函数。所以,我的析构函数将调用作用域的末尾,以便调用它的次数超过要求。 我的班级定义是

class IntArray
{
public:
    IntArray(int size);
    //IntArray(const IntArray& ref);
    ~IntArray();
    IntArray& operator= (const IntArray&);
    const int& operator[] (int index) const;
    friend ostream& operator <<(ostream&, IntArray);
    friend istream& operator >>(istream&, IntArray);
    friend IntArray operator *(const IntArray&, const IntArray&);
    friend IntArray operator +(const IntArray&, const IntArray&);
    friend IntArray operator -(const IntArray&, const IntArray&);
    friend bool operator ==(const IntArray&, const IntArray&);
    friend bool operator <(const IntArray&, const IntArray&);
    friend bool operator >(const IntArray&, const IntArray&);
    const int& getArr(const int index) const{
        return arr[index];
    }
    void setArr(int value, int index){
        arr[index] = value;
    }
private:
    int* arr;
    int sz;
};
和我的一个二进制重载函数

 IntArray operator- (const IntArray& refOne, const IntArray& refTwo){
        IntArray newArray(refOne.sz);
        int value;
        for(int i = 0; i < refOne.sz-1; i++){
                value = refOne.getArr(i) - refTwo.getArr(i);
                newArray.setArr(value, i);
            }
        return newArray;
    }
感谢您的耐心和建议…

尊重客户。否则,所有二进制操作都是错误的:

IntArray operator- (const IntArray& refOne, const IntArray& refTwo){
    IntArray newArray(refOne.sz);
    int value;
    for(int i = 0; i < refOne.sz-1; i++){
            value = refOne.getArr(i) - refTwo.getArr(i);
            newArray.setArr(value, i);
        }
    return newArray;
}
您可以将其定义为私有:

public:
   IntArray(int size);
private:
   //IntArray(const IntArray& ref);

从编译时起,问题就显而易见了。

1。有什么问题吗?2.实现一个复制构造函数。嗨@LuchianGrigore,我想实现赋值重载。所以我不需要使用复制构造。你的“析构函数”看起来不像析构函数。@mustaa:复制构造经常发生。经常。我很抱歉发送了不完整的问题,但不知怎么的,我忘了发送一些关于我的问题的信息@泽塔我的导师在课堂上解决了一个问题。所以我想我应该使用赋值运算符重载而不是使用复制构造函数。这意味着我应该返回一个引用而不是值?@mustaa否,这意味着你应该实现复制构造函数@mustaa Nooo!从
运算符+
返回值是没有意义的(但对
运算符+=
来说是有意义的)。实现复制构造函数以生成底层动态分配数据的深度副本。@mustaa返回对局部变量的引用是未定义的行为。
/*
 * sampleArrayImplemtation.cpp
 *
 *  Created on: Jul 31, 2012
 *      Author: musbuntu
 */

#include <iostream>
#include <cstdlib>
using namespace std;
class IntArray
{
public:
    IntArray(int size);
    //IntArray(const IntArray& ref);
    ~IntArray();
    IntArray& operator= (const IntArray&);
    const int& operator[] (int index) const;
    friend ostream& operator <<(ostream&, IntArray);
    friend istream& operator >>(istream&, IntArray);
    friend IntArray operator *(const IntArray&, const IntArray&);
    friend IntArray operator +(const IntArray&, const IntArray&);
    friend IntArray operator -(const IntArray&, const IntArray&);
    friend bool operator ==(const IntArray&, const IntArray&);
    friend bool operator <(const IntArray&, const IntArray&);
    friend bool operator >(const IntArray&, const IntArray&);
    const int& getArr(const int index) const{
        return arr[index];
    }
    void setArr(int value, int index){
        arr[index] = value;
    }
private:
    int* arr;
    int sz;
};
IntArray& IntArray::operator= (const IntArray& ref){
    if(this!=&ref){
        delete[] arr;
        sz = ref.sz;
        arr = new int[sz];
        for (int i=0; i<sz;i++)
            arr[i] = ref.arr[i];
    }
    return *this;
}
bool operator< (const IntArray& valOne, const IntArray& valTwo){
    int flag(0);
    for(int i = 0;i<valOne.sz;i++)
    {
        if (valOne[i] < valTwo[i]){
            flag = 1;
        }
        else{
            return(0);
        }
    }
    return(flag);
}
bool operator> (const IntArray& valOne, const IntArray& valTwo){
    int flag(0);
    for(int i = 0;i<valOne.sz;i++)
    {
        if (valOne[i] > valTwo[i]){
            flag = 1;
        }
        else{
            return(0);
        }
    }
    return(flag);
}

bool operator== (const IntArray& valOne, const IntArray& valTwo){
    int flag(0);
    for(int i = 0;i<valOne.sz;i++)
    {
        if (valOne[i] == valTwo[i]){
            flag = 1;
        }
        else{
            return(0);
        }
    }
    return(flag);
}
IntArray operator- (const IntArray& refOne, const IntArray& refTwo){
    IntArray newArray(refOne.sz);
    int value;
    for(int i = 0; i < refOne.sz-1; i++){
            value = refOne.getArr(i) - refTwo.getArr(i);
            newArray.setArr(value, i);
        }
    return newArray;
}
IntArray operator+ (const IntArray& refOne, const IntArray& refTwo){
    IntArray newArray(refOne.sz);
    int value;
        for(int i = 0; i < refOne.sz-1; i++){
            value = refOne.getArr(i) + refTwo.getArr(i);
                newArray.setArr(value, i);
            }
    return newArray;
}
IntArray operator* (const IntArray& refOne, const IntArray& refTwo){
    IntArray newArray(refTwo.sz);
    int value;
        for(int i = 0; i < refOne.sz-1; i++){
                value = refOne.getArr(i) * refTwo.getArr(i);
                newArray.setArr(value, i);
            }
    return newArray;
}
istream& operator>> (istream& inputStream, IntArray ref){
    cout << "Enter one by one with respect to a comma> ";
    for(int i = 0; i < ref.sz; i++){
        inputStream >> ref.arr[i];
    }
    return inputStream;
}
ostream& operator<< (ostream& outStream, IntArray ref){
    outStream << "\nYour array has size = " << ref.sz << " and all members are:" << endl;
    for (int i = 0; i < ref.sz; i++){
        outStream << ref[i] << "\t";
    }
    return outStream;
}
const int& IntArray::operator[] (int index) const{
    if (index >= 0 && index < sz){
        return(arr[index]);
    }
    else{
        cerr << "Index out of range, therefore use vectors instead." << endl;
    }
//  return(arr[1]);
}
IntArray::IntArray(int size){
    sz = size;
    arr = new int[size];
    for (int i = 0;i < size; i++)
        arr[i] = 0;
}
//IntArray::IntArray(const IntArray& ref){
//  arr = new int[ref.sz];
//  for(int i=0;i<ref.sz;i++)
//      arr[i] = ref.arr[i];
//}
IntArray::~IntArray(){
    delete[] arr;
}

int main(){
    int sz;
    cout << "Enter size of array> ";
    cin >> sz;
    IntArray arr1(sz);
    arr1.setArr(5, 3);
    IntArray arr2(sz);
    //arr2 = arr1;
    IntArray arr3(sz), arr4(sz), arr5(sz), arr6(sz);
    arr2.setArr(2, 1);
    arr6 = arr1;
    cout << arr6;
    arr3 = arr2 - arr1;
    arr4 = arr1 * arr2;
    arr5 = arr2 + arr1;
    if (arr6 == arr5)
        cout << "It's working.";
    if (arr2 < arr5)
        cout << "It's working, too";
    if (arr4 > arr2)
        cout << "It is also working.";
    cout << arr1 << arr2 << arr3 << arr4 << arr5 << arr6;
    return 0;
}
#include <algorithm>
IntArray(const IntArray& ref):sz(ref.sz), arr(new int[ref.sz]){
    copy(ref.arr, ref.arr + ref.sz, arr);
}
IntArray operator- (const IntArray& refOne, const IntArray& refTwo){
    IntArray newArray(refOne.sz);
    int value;
    for(int i = 0; i < refOne.sz-1; i++){
            value = refOne.getArr(i) - refTwo.getArr(i);
            newArray.setArr(value, i);
        }
    return newArray;
}
public:
   IntArray(int size);
   //IntArray(const IntArray& ref);
public:
   IntArray(int size);
private:
   //IntArray(const IntArray& ref);