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

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

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

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

14.06.2012, 23:55. Просмотров 711. Ответов 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++
опять же проблема с лабой. помоги дописать деструктор. #include &quot;stdafx.h&quot; #include &lt;string&gt; #include &lt;iostream&gt; using...

конструктор и деструктор в C++ - C++
Помогите добавить в прогу конструктор и деструктор #include &lt;iostream&gt; using namespace std; class preamougolinik { private: ...

Деструктор не вызывается - C++
В одном классе я создаю объект, и если проверку не проходит, я его возвращаю в другой метод, дабы у меня там начало всех начал,Главное...

Конструктор, деструктор - C++
Дорогие друзья, программисты. Помогите пожалуйста разобраться с конструктором и деструктором, а так же перегрузкой. Фотография прилагается...

виртуальный деструктор - C++
есть такой пример, у меня вопрос, почему здесь деструктор декларирован просто как деструктор, а не виртуальный (и является ли он в данном...

Нужен ли деструктор? - C++
Вопрос туп, но что-то переклинило, извиняйте. Делаю в Qt. class A { QList&lt;int&gt;* list public: A() { list = new...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 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
Каратель
Эксперт С++
6553 / 3973 / 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
Каратель
Эксперт С++
6553 / 3973 / 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
Каратель
Эксперт С++
6553 / 3973 / 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
Каратель
Эксперт С++
6553 / 3973 / 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++
Работаю в среде DEVc++ #include &lt;iostream&gt; #include &lt;string.h&gt; using namespace std; class Employee { ...

Не работает деструктор - C++
Прошу помощи.Делаю лабораторную. Написал программу для подсчета суммы элементов в тех строках динамического массива, которые содержат хотя...

Конструктор/деструктор - C++
Подскажите пожалуйста как внедрить в вот эту программу конструктор и деструктор... В программе есть базовый класс (летательные аппараты)...

Конструктор и деструктор - C++
Помогите к этой программе написать Конструктор и деструктор класса #include &lt;iostream&gt; using namespace std; class card { ...


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

Или воспользуйтесь поиском по форуму:
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     Вылетает деструктор
Ответ Создать тему
Опции темы

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