Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

вызов деструктора не в кассу)

6.8K
02 февраля 2009 года
artemkaint
60 / / 12.07.2006
есть два класс

Код:
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;
}



собственно после вызова метода get
 
Код:
Class1 a;
Class 2 b;
b = a.get();

получаем что переменная b пуста...думаю что проблема в деструкторе...
11
02 февраля 2009 года
oxotnik333
2.9K / / 03.08.2007
здесь:
 
Код:
Class2 Class1::get()
{
    Class2 tmp(4);
    return tmp;
}

объект создается и тут же удаляется (выход из ф-ции)
6.8K
02 февраля 2009 года
artemkaint
60 / / 12.07.2006
хорошо...но я ж его во внешний мир отправляю...туда то он должен попасть...и потом начать присваиваться...а какие другие решения...если не удалять в деструкторе - то память утекает
11
02 февраля 2009 года
oxotnik333
2.9K / / 03.08.2007
ввести в классе Class1 член ввиде Claass2 *tmp;
Код:
Class2 * Class1::get()
{
 tmp = new Class2(4);
 return tmp;
}// и в деструкторе
Class1::~Class1()
{
....
  delete tmp;
......
}
6.8K
02 февраля 2009 года
artemkaint
60 / / 12.07.2006
Der Meister, думал привести к этому виду...но хочется написать в обычном виде получения результата из процедуры..


после введения переменной - идиотская ошибка на
_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));

в дебагере...в dbgdel.cpp
355
02 февраля 2009 года
&lt;SCORP&gt;
786 / / 21.10.2006
Цитата: oxotnik333
ввести в классе Class1 член ввиде Claass2 *tmp;
Код:
Class2 * Class1::get()
{
 tmp = new Class2(4);
 return tmp;
}// и в деструкторе
Class1::~Class1()
{
....
  delete tmp;
......
}


два вызова Class1::get() и начинаем получить мемори лики

думаю, в данном случае должно помочь определение конструктора копирования для Class2. когда из Class1::get() возвращается объект по значению, он копируется. простые типы (в данном случае указатель) копируются тоже как значение (т.е. в скопированом объекте указатель будет указывать на tmp.m), а самого tmp уже к этому времени не будет.
в конструкторе копирования нужно скопировать двумерный массив (как в операторе присвоения)
в таком случае это всё должно работать, но двумерный массив одной строчкой (Class1 a = class2Inst.get()) будет копироваться два раза - один раз при возвращении значения, второй - при присвоении

260
03 февраля 2009 года
Ramon
1.1K / / 16.08.2003
 
Код:
Class2 Class1::get()
{
    return Class2(4);
}



и по хорошему должно наличиствовать нечто под названием "конструктор копирования" вида

 
Код:
Class2::Class2(const Class2&)


И еще в операторе присвания вы принимаете и возвращаете копии объектов, а нафег?

 
Код:
Class2& Class2::operator=(const Class2& a)


И проверки на присвоение самому себе нет.

Диагноз: Необходимо изучить цикл жизни объектов и чем отличается передача и возврат по ссылке и по значению.
11
03 февраля 2009 года
oxotnik333
2.9K / / 03.08.2007
[quote=<SCORP>;275133]два вызова Class1::get() и начинаем получить мемори лики
[/quote]
для этого есть своя голова, которая опишет логику класса
не буду ж я писать за автора весь код, тем более его логикой не владею
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог