Форум программистов, компьютерный форум CyberForum.ru

Деструктор вызывается до то возвращения значения из функции - C++

Восстановить пароль Регистрация
 
1ые
1 / 1 / 0
Регистрация: 19.01.2013
Сообщений: 98
08.02.2013, 07:58     Деструктор вызывается до то возвращения значения из функции #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
hi hi::operator+(const hi& in)
{
    struc * cur = last;
    struc *curs = in.last;
    hi out("0");
 
    int ost = 0, i = cur->a + curs->a + ost;
    if (i > 9)
    {
        out.last->a  = i - 10;
        ost = 1;
    }
    else
        out.last->a = i;
    struc * ucaz = out.last;
    cur = cur->prev; curs = curs->prev;
    while(cur && curs)
    {
        ucaz->prev = new struc (0);
        ucaz = ucaz->prev;
 
        i = cur->a + curs->a + ost;
        if (i > 9) 
        {
            ucaz->a = i - 10;
            ost = 1;
        }
        else
        {
            ucaz->a = i;
            ost = 0;
        }
        cur = cur->prev; curs = curs->prev;
    }
 
    if ( curs )
    {
        cur = curs;
    }
    
    while( cur )
        {
            ucaz->prev = new struc (0);
            ucaz = ucaz->prev;
 
            i = cur->a + ost;
            if ( i > 9)
            {
                ucaz->a = i - 10;
                ost = 1;
            }
            else 
            {
                ucaz->a = i;
                ost = 0;
            }
            cur = cur->prev;
        }
 
        if ( ost != 0)
        {
            ucaz->prev = new struc(1);
            ucaz = ucaz->prev;
        }
        out.first = ucaz;
        return out;
 
}
на всякий случай заголовочный файл:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#ifndef HUGEINT1_H
#define HUGEINT1_H
#include <iostream>
using namespace std;
class hi
{
    friend ostream & operator<< (ostream &, const hi &);
private:
    struct struc
    {
        short int a;
        struc * prev;
        struc(short int b, struc * nex = 0)
        {
            a = b;
            prev = nex;
        }
    };
    struc * first;
    struc * last;
public:
    hi(const char *);
    const hi & operator=(const hi&);
    hi operator+(const hi&);
    ~hi();
};
#endif
проблема в том что деструктор для out вызывается до того как оператор возвращает значение. Что нужно сделать чтобы оператор возвращал значение?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.02.2013, 07:58     Деструктор вызывается до то возвращения значения из функции
Посмотрите здесь:

Два раза вызывается деструктор C++
Когда вызывается деструктор класса? C++
Не вызывается деструктор C++
C++ Деструктор не вызывается
Не вызывается деструктор C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
08.02.2013, 08:06     Деструктор вызывается до то возвращения значения из функции #2
Цитата Сообщение от 1ые Посмотреть сообщение
Что нужно сделать чтобы оператор возвращал значение?
Конструктор копирования у класса hi.
1ые
1 / 1 / 0
Регистрация: 19.01.2013
Сообщений: 98
08.02.2013, 08:28  [ТС]     Деструктор вызывается до то возвращения значения из функции #3
Цитата Сообщение от lemegeton Посмотреть сообщение
Конструктор копирования у класса hi.
для чего?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,899
Записей в блоге: 2
Завершенные тесты: 1
08.02.2013, 08:30     Деструктор вызывается до то возвращения значения из функции #4
Цитата Сообщение от 1ые Посмотреть сообщение
для чего?
чтобы скопировать out в возвращаемое значение
1ые
1 / 1 / 0
Регистрация: 19.01.2013
Сообщений: 98
08.02.2013, 09:13  [ТС]     Деструктор вызывается до то возвращения значения из функции #5
А что если мне нужно просто вывести результат через cout
я уже перегрузил оператор <<
C++
1
2
3
4
5
6
7
8
9
10
ostream & operator << (ostream & output, const hi & b)
{
    hi::struc * ptr = b.last;
    while(ptr)
    {
        output << ptr->a;
        ptr = ptr->prev;
    }
    return output;
}
и в программе написал

C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <hugeint1.h>
using namespace std;
int main()
{
    hi a("123"), b("456");
    cout << "Rezult" <<  a+b;
    system("pause");
    return 0;
}
После оператора + вызывается конструктор копии но проблема что копировать некуда по сути и конструктор выводит ошибку т.к идет обращение к несуществующей памяти

Добавлено через 15 минут
конструктор копии:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
hi::hi(const hi & val)
{
    if (this != &val)
    {
        struc * f = last;
        struc * vrem = 0;
        while(f)
        {
            vrem = f;
            f = f->prev;
            delete vrem;
        }
 
        struc * qw = val.last;
        struc * qwc = new struc(val.last->a);
        last = qwc;
        qw = qw -> prev;
        while(qw)
        {
            qwc -> prev = new struc(qw -> a);
            qwc = qwc -> prev;
            qw = qw -> prev;
        }
        first = qwc;
    }
    else
    {
        cout << "sdsa";
    }
}
Ошибку выдает на 11 строке понятно почему ошибка но ведь если я не ошибаюсь while в этом случае вообще не разу не должен был сработать?
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
08.02.2013, 12:21     Деструктор вызывается до то возвращения значения из функции #6
Цитата Сообщение от 1ые Посмотреть сообщение
while(f)
* * * * {
* * * * * * vrem = f;
* * * * * * f = f->prev;
* * * * * * delete vrem;
* * * * }
То ли лыжи не едут... то ли дело во мне. Зачем вы в конструкторе копий что-то удаляете?! Конструктор копии нужен, чтобы создать объект, равный передаваемому в параметре. Просто скопируйте содержимое объекта, переданного параметром, в "текущий" объект.

Цитата Сообщение от 1ые Посмотреть сообщение
копировать некуда по сути
Результат выражения a+b будет скопирован во временную переменную и передан параметром в оператор <<.
1ые
1 / 1 / 0
Регистрация: 19.01.2013
Сообщений: 98
09.02.2013, 07:56  [ТС]     Деструктор вызывается до то возвращения значения из функции #7
А если этот же конструктор будет использован для копирования в уже созданный обьект типа hi a(b);
где в переменную ' a ' класса hi копируется переменная b. Вернее ее содержимое!?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2013, 00:04     Деструктор вызывается до то возвращения значения из функции
Еще ссылки по теме:

C++ При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О
C++ Вызывается ли деструктор в данной программе?
C++ Почему не вызывается деструктор?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
10.02.2013, 00:04     Деструктор вызывается до то возвращения значения из функции #8
Конструктор вызывается только при создании объекта. Объект никак не может быть уже создан.
Yandex
Объявления
10.02.2013, 00:04     Деструктор вызывается до то возвращения значения из функции
Ответ Создать тему
Опции темы

Текущее время: 04:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru