C++ 赋值重载显式调用析构函数(在执行其他二进制重载运算符之后)
我的问题很简单(double-free或corruption(fasttop)),有一个解决方案()。但是,我无法实现它。我不知道问题出在哪里。当我跟踪我的程序时,我看到它发生在二进制运算符执行之后。。。 例如,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
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);