class Class1
{
public:
Class1(void);
~Class1(void);
Class2 get();
};
Class2 Class1::get()
{
Class2 tmp(4);
return tmp;
}
вызов деструктора не в кассу)
Код:
Код:
class Class2
{
public:
Class2(void);
~Class2(void);
Class2(int);
Class2 operator = (Class2 a);
int size;
double **m;
};
Class2::Class2(void)
{
size = 0;
}
Class2::~Class2(void)
{
for (int i = 0; i<size; i++) delete[] m;
delete []m;
}
Class2::Class2(int size)
{
this->size = size;
m = new double*[size];
for (int i=0; i<size; i++)
{
m = new double [size];
for (int j = 0;j<size; j++)
m[j] = 0;
}
}
Class2 Class2::operator = (Class2 a)
{
if (this->size != 0)
{
for (int i = 0; i<size; i++) delete[] this->m;
delete [] this->m;
}
this->size = a.size;
this->m = new double*[size];
for (int i=0; i<size; i++)
{
this->m = new double [size];
for (int j = 0;j<size; j++)
this->m[j] = a.m[j];
}
return *this;
}
{
public:
Class2(void);
~Class2(void);
Class2(int);
Class2 operator = (Class2 a);
int size;
double **m;
};
Class2::Class2(void)
{
size = 0;
}
Class2::~Class2(void)
{
for (int i = 0; i<size; i++) delete[] m;
delete []m;
}
Class2::Class2(int size)
{
this->size = size;
m = new double*[size];
for (int i=0; i<size; i++)
{
m = new double [size];
for (int j = 0;j<size; j++)
m[j] = 0;
}
}
Class2 Class2::operator = (Class2 a)
{
if (this->size != 0)
{
for (int i = 0; i<size; i++) delete[] this->m;
delete [] this->m;
}
this->size = a.size;
this->m = new double*[size];
for (int i=0; i<size; i++)
{
this->m = new double [size];
for (int j = 0;j<size; j++)
this->m[j] = a.m[j];
}
return *this;
}
собственно после вызова метода get
Код:
Class1 a;
Class 2 b;
b = a.get();
Class 2 b;
b = a.get();
получаем что переменная b пуста...думаю что проблема в деструкторе...
Код:
Class2 Class1::get()
{
Class2 tmp(4);
return tmp;
}
{
Class2 tmp(4);
return tmp;
}
объект создается и тут же удаляется (выход из ф-ции)
хорошо...но я ж его во внешний мир отправляю...туда то он должен попасть...и потом начать присваиваться...а какие другие решения...если не удалять в деструкторе - то память утекает
Код:
Class2 * Class1::get()
{
tmp = new Class2(4);
return tmp;
}// и в деструкторе
Class1::~Class1()
{
....
delete tmp;
......
}
{
tmp = new Class2(4);
return tmp;
}// и в деструкторе
Class1::~Class1()
{
....
delete tmp;
......
}
после введения переменной - идиотская ошибка на
_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
в дебагере...в dbgdel.cpp
Цитата: oxotnik333
ввести в классе Class1 член ввиде Claass2 *tmp;
Код:
Class2 * Class1::get()
{
tmp = new Class2(4);
return tmp;
}// и в деструкторе
Class1::~Class1()
{
....
delete tmp;
......
}
{
tmp = new Class2(4);
return tmp;
}// и в деструкторе
Class1::~Class1()
{
....
delete tmp;
......
}
два вызова Class1::get() и начинаем получить мемори лики
думаю, в данном случае должно помочь определение конструктора копирования для Class2. когда из Class1::get() возвращается объект по значению, он копируется. простые типы (в данном случае указатель) копируются тоже как значение (т.е. в скопированом объекте указатель будет указывать на tmp.m), а самого tmp уже к этому времени не будет.
в конструкторе копирования нужно скопировать двумерный массив (как в операторе присвоения)
в таком случае это всё должно работать, но двумерный массив одной строчкой (Class1 a = class2Inst.get()) будет копироваться два раза - один раз при возвращении значения, второй - при присвоении
Код:
Class2 Class1::get()
{
return Class2(4);
}
{
return Class2(4);
}
и по хорошему должно наличиствовать нечто под названием "конструктор копирования" вида
Код:
Class2::Class2(const Class2&)
И еще в операторе присвания вы принимаете и возвращаете копии объектов, а нафег?
Код:
Class2& Class2::operator=(const Class2& a)
И проверки на присвоение самому себе нет.
Диагноз: Необходимо изучить цикл жизни объектов и чем отличается передача и возврат по ссылке и по значению.
[/quote]
для этого есть своя голова, которая опишет логику класса
не буду ж я писать за автора весь код, тем более его логикой не владею