zl3p
09-02-2007, 03:04
Решение этой проблемы меня уже порядком достало, поэтому решил спросить у профессионалов, знающих ООП.
Проблема собтвенно в том, что в следующем перезагруженном операторе выполняется 1 коструктор и 2 деконструктора. От куда берется второй деконструктор в этом коде:
vector vector::operator + (const vector &obj)
{
if (this->n != obj.n) cout << "Error: diff. dim\n";
vector tmp(obj.n);
for (long i=0; i<obj.n; i++) {
tmp.x[i] = this->x[i] + obj.x[i];
}
return tmp;
}
У меня здесь динамическое выделение памяти под объекты, и, естественно, что двухразовое выполнение delete ни к чему хорошему привести не может. Поэтому хочу устраниться данную ошибку. Ниже полный код проги:
#define real double
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
//--------------
class vector
{
public:
real *x;
long n;
public:
vector();
vector(long);
~vector();
vector& operator = (const vector&);
vector operator + (const vector&);
};
vector::vector ()
{
n = 1;
x = new real[n];
cout << "constructor \n";
}
vector::vector (long dim)
{
n = dim;
if (n>0) x = new real[n];
cout << "constructor \n";
}
vector::~vector()
{
delete[] x;
n = 0;
cout << "destructor \n";
}
vector& vector::operator = (const vector &obj)
{
if (this->n != obj.n) cout << "Error: diff. dim\n";
for (long i=0; i<obj.n; i++) {
this->x[i] = obj.x[i];
cout << obj.x[i] << " , " << this->x[i] << "\n";
}
return (*this);
}
vector vector::operator + (const vector &obj)
{
if (this->n != obj.n) cout << "Error: diff. dim\n";
vector tmp(obj.n);
for (long i=0; i<obj.n; i++) {
tmp.x[i] = this->x[i] + obj.x[i];
}
return tmp;
}
//-----------
void main()
{
{
vector a(3);
vector b(3);
a + b;
}
getch();
}
//================
результат её выполнения:
constructor
constructor
constructor
destructor
destructor // !!!!!!
destructor
destructor
Проблема собтвенно в том, что в следующем перезагруженном операторе выполняется 1 коструктор и 2 деконструктора. От куда берется второй деконструктор в этом коде:
vector vector::operator + (const vector &obj)
{
if (this->n != obj.n) cout << "Error: diff. dim\n";
vector tmp(obj.n);
for (long i=0; i<obj.n; i++) {
tmp.x[i] = this->x[i] + obj.x[i];
}
return tmp;
}
У меня здесь динамическое выделение памяти под объекты, и, естественно, что двухразовое выполнение delete ни к чему хорошему привести не может. Поэтому хочу устраниться данную ошибку. Ниже полный код проги:
#define real double
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
//--------------
class vector
{
public:
real *x;
long n;
public:
vector();
vector(long);
~vector();
vector& operator = (const vector&);
vector operator + (const vector&);
};
vector::vector ()
{
n = 1;
x = new real[n];
cout << "constructor \n";
}
vector::vector (long dim)
{
n = dim;
if (n>0) x = new real[n];
cout << "constructor \n";
}
vector::~vector()
{
delete[] x;
n = 0;
cout << "destructor \n";
}
vector& vector::operator = (const vector &obj)
{
if (this->n != obj.n) cout << "Error: diff. dim\n";
for (long i=0; i<obj.n; i++) {
this->x[i] = obj.x[i];
cout << obj.x[i] << " , " << this->x[i] << "\n";
}
return (*this);
}
vector vector::operator + (const vector &obj)
{
if (this->n != obj.n) cout << "Error: diff. dim\n";
vector tmp(obj.n);
for (long i=0; i<obj.n; i++) {
tmp.x[i] = this->x[i] + obj.x[i];
}
return tmp;
}
//-----------
void main()
{
{
vector a(3);
vector b(3);
a + b;
}
getch();
}
//================
результат её выполнения:
constructor
constructor
constructor
destructor
destructor // !!!!!!
destructor
destructor