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

При повторном обращении к объекту меняется его содержимое - C++

Восстановить пароль Регистрация
 
maria_
5 / 5 / 1
Регистрация: 25.08.2013
Сообщений: 67
26.10.2013, 01:23     При повторном обращении к объекту меняется его содержимое #1
Добрый день!
У меня такая странная проблема:
есть две одинаковые строчки кода подряд:
C++
1
2
cout << testTree.rightSon->siz << endl;
cout << testTree.rightSon->siz << endl;
Выводится сначала число 13, затем число 0.
В программе задумано, чтобы siz действительно было равно 13.
Скажите, пожалуйста, почему значение может так меняться? Код не привожу, т.к. там кода очень много и он запутанный, по нему ничего не понять. Вдруг кто знает теоретически, из-за чего такое может случиться, может у кого так было?
P.S.
если перед этими двумя операциями вывода вывести ещё что-то (что угодно), то обе строчки выведут число 0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2013, 01:23     При повторном обращении к объекту меняется его содержимое
Посмотрите здесь:

C++ Не работает програма при повторном запуске!
При записи в начало бинарного файла удаляется все его содержимое C++
C++ Ошибка при повторном получении данных из потока cin
Программа взаимодействует с классом исключительно через интерфейс. Однажды класс меняется и меняется его хидер. Надо ли перекомпилировать всю программ C++
вылетает программа при обращении к объекту класса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Hunter13ua
46 / 46 / 5
Регистрация: 25.10.2011
Сообщений: 183
26.10.2013, 01:26     При повторном обращении к объекту меняется его содержимое #2
Как вариант, не зная деталей: если у Вас перезагружен оператор cout << для некоторого класса, то в нём может быть ошибка - зануление выводимого объекта.
maria_
5 / 5 / 1
Регистрация: 25.08.2013
Сообщений: 67
26.10.2013, 01:28  [ТС]     При повторном обращении к объекту меняется его содержимое #3
Нет, не перегружала оператор

Добавлено через 39 секунд
siz - это int
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.10.2013, 01:28     При повторном обращении к объекту меняется его содержимое #4
Скорее всего, вот здесь:
C++
1
cout << testTree.rightSon->siz << endl;
выводится значение некой локальной переменной, которой уже, как бы, и нет, но память под ней ещё не занята ОС.
maria_
5 / 5 / 1
Регистрация: 25.08.2013
Сообщений: 67
26.10.2013, 01:30  [ТС]     При повторном обращении к объекту меняется его содержимое #5
А разве, если бы cout был перегружен для выводимого класса, то тогда влиял бы на всё вызов cout для чего-то постороннего перед этими двумя вызовами?
Hunter13ua
46 / 46 / 5
Регистрация: 25.10.2011
Сообщений: 183
26.10.2013, 01:34     При повторном обращении к объекту меняется его содержимое #6
Нет, но кто сказал, что здесь ровно 1 ошибка ? В этом случае было бы две: одна в перегруженном операторе, а вторая еще где. А так, не пойму. Аж интересно стало. Я обычно в таких случаях очень тщательно дебаггом играюсь.
maria_
5 / 5 / 1
Регистрация: 25.08.2013
Сообщений: 67
26.10.2013, 01:34  [ТС]     При повторном обращении к объекту меняется его содержимое #7
Цитата Сообщение от alsav22 Посмотреть сообщение
Скорее всего, вот здесь:
C++
1
cout << testTree.rightSon->siz << endl;
выводится значение некой локальной переменной, которой уже, как бы, и нет, но память под ней ещё не занята ОС.

Попробовала написать так:
C++
1
2
3
4
int k = 100;
int m = k;
cout << testTree.rightSon->siz << endl;
cout << testTree.rightSon->siz << endl;
Как я понимаю, если первый вызов cout раньше портил память, то теперь k и m должны её портить, и теперь уже при первом вызове cout должно выводиться не 13. А выводится 13.
Т.е. если предположить, что такая проблема с памятью, то как понять, что это точно она?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
26.10.2013, 01:41     При повторном обращении к объекту меняется его содержимое #8
Цитата Сообщение от maria_ Посмотреть сообщение
Как я понимаю, если первый вызов cout раньше портил память, то теперь k и m должны её портить, и теперь уже при первом вызове cout должно выводиться не 13. А выводится 13.
объявление переменных никак не связано с выводом.
Скорее всего вы выводите неинициализированную строку, в которой содержится случайный мусор. Также возможен вариант в неверных подсчетах. Случайных ошибок может быть масса, вы же не предоставили код класса, а также методов, которые могут вызываться и изменять состояние объекта до вывода на экран.
maria_
5 / 5 / 1
Регистрация: 25.08.2013
Сообщений: 67
26.10.2013, 01:42  [ТС]     При повторном обращении к объекту меняется его содержимое #9
Попробовала написать вот так:
C++
1
2
3
testTree.rightSon->siz = 13;
cout << testTree.rightSon->siz << endl;
cout << testTree.rightSon->siz << endl;
Результат тот же. Как это объяснить?
Shtirliz72
200 / 160 / 38
Регистрация: 25.10.2013
Сообщений: 527
26.10.2013, 01:51     При повторном обращении к объекту меняется его содержимое #10
Цитата Сообщение от maria_ Посмотреть сообщение
Результат тот же. Как это объяснить?
У вас указатель на int ссылается на уже освобождённое место. Соответственно то, что вы туда ещё раз записали - роли играть не будет.

Добавлено через 4 минуты
Советую обратить внимание на места где осуществляется манипулирование указателем rightSon: выделение памяти, удаление, копирование указателя и прочее.
maria_
5 / 5 / 1
Регистрация: 25.08.2013
Сообщений: 67
26.10.2013, 01:55  [ТС]     При повторном обращении к объекту меняется его содержимое #11
Цитата Сообщение от Shtirliz72 Посмотреть сообщение
У вас указатель на int ссылается на уже освобождённое место. Соответственно то, что вы туда ещё раз записали - роли играть не будет.

Добавлено через 4 минуты
Советую обратить внимание на места где осуществляется манипулирование указателем rightSon: выделение памяти, удаление, копирование указателя и прочее.
Да, спасибо) Действительно rightSon указывает в никуда)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.10.2013, 02:02     При повторном обращении к объекту меняется его содержимое #12
Среда какая? Компилируете Debug?
maria_
5 / 5 / 1
Регистрация: 25.08.2013
Сообщений: 67
26.10.2013, 10:58  [ТС]     При повторном обращении к объекту меняется его содержимое #13
Цитата Сообщение от alsav22 Посмотреть сообщение
Среда какая? Компилируете Debug?
Visual Studio 2008, Debug

Добавлено через 6 минут
Покопалась в своём коде. По сути программа делает вот что:
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
#include<iostream>
using std::cout;
using std::cin;
using std::endl;
 
class A
{
public:
    A* a;
    int x;
    A(){}
    void Insert( int X )
    {
        A newA;
        A* newaPtr = &newA;
        newaPtr->x = X;
        a = newaPtr;
    }
};
 
int main()
{
    A v1;
    v1.Insert(13);
    cout << v1.a->x << endl;
    cout << v1.a->x << endl;
    cout << v1.a->x << endl;
    getchar();
    return 0;
}
Первый раз выводится 13, а остальные два - чушь, потому что поле a в v1 оказывается не определено, хотя в Insert я пытаюсь его определить. Как можно сделать, чтобы интерфейс был такой же, но поле a присваивалось?
Shtirliz72
200 / 160 / 38
Регистрация: 25.10.2013
Сообщений: 527
26.10.2013, 11:56     При повторном обращении к объекту меняется его содержимое #14
Цитата Сообщение от maria_ Посмотреть сообщение
Первый раз выводится 13, а остальные два - чушь, потому что поле a в v1 оказывается не определено, хотя в Insert я пытаюсь его определить. Как можно сделать, чтобы интерфейс был такой же, но поле a присваивалось?
Девушка, у вас newA - локальная переменная функции Insert, которая уничтожается сразу после завершения работы этой функции(сразу после a = newaPtr). Выделяйте под указатель место с помощью оператора new.
Тоесть:
C++
1
2
3
4
5
6
7
    void Insert( int X )
    {
        A newA; // переменная уничтожается сразу после выполнения строки a = newaPt
        A* newaPtr = &newA; // здесь лучше A* newAPtr = new A;
        a = newaPtr;
    }
};
С другой стороны подобный подход:
C++
1
2
3
4
5
6
7
8
9
10
11
class A
{
public:
    A* a;
    void Insert( int X )
    {
        A newA;
        A* newaPtr = &newA;
        a = newaPtr;
    }
}
ничего кроме недоумения не вызывает. У вас точно всё нормально со структурой проекта?
maria_
5 / 5 / 1
Регистрация: 25.08.2013
Сообщений: 67
26.10.2013, 12:45  [ТС]     При повторном обращении к объекту меняется его содержимое #15
Цитата Сообщение от Shtirliz72 Посмотреть сообщение
Выделяйте под указатель место с помощью оператора new.
Спасибо! Это помогло)

Цитата Сообщение от Shtirliz72 Посмотреть сообщение
ничего кроме недоумения не вызывает. У вас точно всё нормально со структурой проекта?
Вы имеете в виду то, что всё содержимое класса помечено как public? Так это не сам проект, а небольшая программа, отражающая проблемный участок проекта. Я здесь не заморачивалась насчёт public-private
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.10.2013, 19:10     При повторном обращении к объекту меняется его содержимое
Еще ссылки по теме:

C++ при повторном "обращении" к заранее созданному массиву последний элемент отображается неверно
C++ При обращении к структуре из класса возникает исключение:нарушение прав доступа при записи. Почему?
C++ VS кидает исключение при повторном освобождении памяти

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

Или воспользуйтесь поиском по форуму:
Shtirliz72
200 / 160 / 38
Регистрация: 25.10.2013
Сообщений: 527
26.10.2013, 19:10     При повторном обращении к объекту меняется его содержимое #16
Цитата Сообщение от maria_ Посмотреть сообщение
Спасибо! Это помогло)
Я рад. Главное не забудьте что по хорошему занятое место надо когда-нибудь освобождать с помощью delete.
Цитата Сообщение от maria_ Посмотреть сообщение
Вы имеете в виду то, что всё содержимое класса помечено как public? Так это не сам проект, а небольшая программа, отражающая проблемный участок проекта. Я здесь не заморачивалась насчёт public-private
Нет, я имею в виду что хотя в классе уже существует x, вместо того чтобы значение записать туда - создается абсолютно такой же класс и только туда записывается x. Или же это упрощение сыграло такую роль. Просто само по себе выглядит бредово.
Yandex
Объявления
26.10.2013, 19:10     При повторном обращении к объекту меняется его содержимое
Ответ Создать тему
Опции темы

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