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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Konkin
0 / 0 / 0
Регистрация: 03.12.2010
Сообщений: 30
#1

Вылетает деструктор - C++

14.06.2012, 23:55. Просмотров 690. Ответов 10
Метки нет (Все метки)

Здравствуйте. Есть класс Node.

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
class Node 
{
 
public:
    Node();
    ~Node();
 
    /* Методы */
    //// bla bla bla их тут много
 
private:
    /* Поля */
    QString value; 
    expNodeType type;
    QList <Node *> operands; // Дети узла
    Case _case;
    int node_id; 
    QString line; 
    QString line_s;
};
 
Node::~Node()
{
 
}
В одной из функций делаю так:

C++
1
2
3
4
5
6
7
// bla bla bla
 
Node realNode;
Node * realPtrNode = genTree(lexems,params,userTypes,functions);
realNode = * realPtrNode;
 
// bla bla bla
По окончании работы функции, при попытки уничтожить локальные объекты деструктор вылетает.
С помощью трассировки поглядел вылетает он именно на объекте realNode. В связи с чем так происходит и как от этого избавиться?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.06.2012, 23:55     Вылетает деструктор
Посмотрите здесь:

деструктор C++
Деструктор C++
Деструктор C++
C++ Деструктор
Деструктор C++
C++ Деструктор
C++ Деструктор
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
14.06.2012, 23:59     Вылетает деструктор #2
показывайте весь код
как заполняется этот список?
Цитата Сообщение от Konkin Посмотреть сообщение
QList <Node *> operands; // Дети узла
Konkin
0 / 0 / 0
Регистрация: 03.12.2010
Сообщений: 30
15.06.2012, 00:03  [ТС]     Вылетает деструктор #3
Цитата Сообщение от Jupiter Посмотреть сообщение
показывайте весь код
как заполняется этот список?
В данном случае пуст.

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
// Не реализована и возвращает просто указатель на пустой объект
Node* genTree(const QStringList &lexems, const QMap <QString, QStringList> &params, const QList <User_data> &types, const QMap <Func, QStringList> &functions)
{
    Node workNode;
    Node * ptrWorkNode = &workNode;
    return ptrWorkNode;
}
 
Node::Node() // Конструктор
{
    value = "";
    line = "";
    line_s = "";
    _case = no;
    node_id = -1;
}
 
void testing::test_genTree() // Функция, где вылетает
{
    QFETCH(QStringList,lexems);
    QFETCH(MAPPARAM,params);
    QFETCH(LISTUSDATA,userTypes);
    QFETCH(MAPFUNC,functions);
    QFETCH(Node,expNode);
 
    Node realNode;
    Node * realPtrNode = genTree(lexems,params,userTypes,functions);
    realNode = * realPtrNode;
 
    QCOMPARE(realNode,expNode); // Сравниваем реальное содержимое узлов
}
Jupiter
Каратель
Эксперт C++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.06.2012, 00:05     Вылетает деструктор #4
Цитата Сообщение от Konkin Посмотреть сообщение
// Не реализована и возвращает просто указатель на пустой объект
возвращает указатель на локальный объект, после выхода из функции там "мусор"
Konkin
0 / 0 / 0
Регистрация: 03.12.2010
Сообщений: 30
15.06.2012, 00:09  [ТС]     Вылетает деструктор #5
Цитата Сообщение от Jupiter Посмотреть сообщение
возвращает указатель на локальный объект, после выхода из функции там мусор
Сейчас прогнал выполнение.. Те поля указателя на объект (ptrWorkNode) которые были в функции, в точности присвоились realPtrNode.
Jupiter
Каратель
Эксперт C++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.06.2012, 00:13     Вылетает деструктор #6
Цитата Сообщение от Konkin Посмотреть сообщение
Сейчас прогнал выполнение.. Те поля указателя на объект (ptrWorkNode) которые были в функции, в точности присвоились realPtrNode.
это ничего не меняет, указатель верхушки стека - "ап" и сдвинулся и данные при этом могут сохранится но это не значит что можно на это полагатся
Konkin
0 / 0 / 0
Регистрация: 03.12.2010
Сообщений: 30
15.06.2012, 00:17  [ТС]     Вылетает деструктор #7
Цитата Сообщение от Jupiter Посмотреть сообщение
это ничего не меняет, указатель верхушки стека - "ап" и сдвинулся и данные при этом могут сохранится но это не значит что можно на это полагатся
Как тогда лучше сделать? Функция возвращает указатель на объект. Мне надо сравнить объект этот с другим.

Переделать функцию, чтобы возвращала объект, а не указатель? Просто это немного изменит мои планы в дальнейшем. Если вариант, чтобы функция возвращала указатель? И чтобы я потом мог корректно все сравнить?
Jupiter
Каратель
Эксперт C++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.06.2012, 00:28     Вылетает деструктор #8
создавать объект динамически (через new) и тут уж либо самому следить за удалением либо использовать смарт-указатели, типа
http://en.cppreference.com/w/cpp/memory/shared_ptr
http://en.cppreference.com/w/cpp/memory/unique_ptr
http://qt-project.org/doc/qt-4.8/qscopedpointer.html
http://qt-project.org/doc/qt-4.8/qsharedpointer.html
Konkin
0 / 0 / 0
Регистрация: 03.12.2010
Сообщений: 30
15.06.2012, 00:47  [ТС]     Вылетает деструктор #9
Цитата Сообщение от Jupiter Посмотреть сообщение
создавать объект динамически (через new) и тут уж либо самому следить за удалением либо использовать смарт-указатели, типа
http://en.cppreference.com/w/cpp/memory/shared_ptr
http://en.cppreference.com/w/cpp/memory/unique_ptr
http://qt-project.org/doc/qt-4.8/qscopedpointer.html
http://qt-project.org/doc/qt-4.8/qsharedpointer.html
C++
1
2
Node * realNode = new Node;
realNode = genTree(lexems,params,userTypes,functions);
Если я правильно понял вас.

Единственное теперь не могу понять, как передать значение этого объекта для сравнения в operator==

C++
1
QCOMPARE(*realNode,expNode);
this хранит мусор, expNode разумеется нормально передается.

C++
1
2
3
4
5
6
7
8
9
10
11
12
bool Node::operator ==(Node obj) const
{
    if(value==obj.value)
        if(type==obj.type)
            if(_case==obj._case)
                if(node_id==obj.node_id)
                    if(line==obj.line)
                        if(line_s==obj.line_s)
                            if(operands==obj.operands)
                                return true;
    return false;
}
P.S. Деструктор работает нормально теперь (если закоментить сравнение)
Jupiter
Каратель
Эксперт C++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.06.2012, 00:50     Вылетает деструктор #10
Цитата Сообщение от Konkin Посмотреть сообщение
Node * realNode = new Node;
realNode = genTree(lexems,params,userTypes,functions);
я имел ввиду что genTree должен вернуть вам new Node
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.06.2012, 00:57     Вылетает деструктор
Еще ссылки по теме:

Деструктор C++
C++ Деструктор!
C++ Почему создается виртуальный деструктор A, а в таблице виртуальных функций лежит деструктор B
C++ Деструктор
C++ Деструктор

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

Или воспользуйтесь поиском по форуму:
Konkin
0 / 0 / 0
Регистрация: 03.12.2010
Сообщений: 30
15.06.2012, 00:57  [ТС]     Вылетает деструктор #11
Цитата Сообщение от Jupiter Посмотреть сообщение
я имел ввиду что genTree должен вернуть вам new Node
Ееее ))) Огромное спасибо ) Получилось )

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void testing::test_genTree()
{
    QFETCH(QStringList,lexems);
    QFETCH(MAPPARAM,params);
    QFETCH(LISTUSDATA,userTypes);
    QFETCH(MAPFUNC,functions);
    QFETCH(Node,expNode);
 
    Node realNode;
        Node * realPtrNode = genTree(lexems,params,userTypes,functions);
        realNode = * realPtrNode;
 
    QCOMPARE(realNode,expNode); // Сравниваем реальное содержимое узлов
}
C++
1
2
3
4
5
Node* genTree(const QStringList &lexems, const QMap <QString, QStringList> &params, const QList <User_data> &types, const QMap <Func, QStringList> &functions)
{
    Node * ptrWorkNode = new Node;
    return ptrWorkNode;
}
Премного благодарен за помощь
Yandex
Объявления
15.06.2012, 00:57     Вылетает деструктор
Ответ Создать тему
Опции темы

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