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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
mamucho666
1 / 1 / 0
Регистрация: 06.06.2012
Сообщений: 13
#1

Удаляется объект когда не требуется и всё равно продолжает существовать - C++

16.07.2012, 17:07. Просмотров 1144. Ответов 24
Метки нет (Все метки)

Всем привет. Честно говоря я не знаю как ещё более правильно описать проблему в заголовке. В общем проходил раздел, посвящённый <functional>, и, собственно, там всё понятно, но заметил одну странность, потом перепроверил в специально написанном для проверки более простом коде и она подтвердилась.
Код ниже выводит на экран вот эти надписи:

ok1
ok2
delete ok1
100

delete ok2

Вопросы мои по поводу выделенных жирным.

1. Зачем удаляется объект класса ок1 до завершения функции в которой он создан?
2. Если он удалился, то откуда тогда взялся доступ к члену этого объекта?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct ok1
{
    ok1(int i):val(i){cout << "ok1" << endl;}
    int val;
    ~ok1(){cout << "delete ok1" << endl;}
};
struct ok2
{
    ok2 (ok1 & refobj):obj(refobj){cout << "ok2" << endl;}
    ok1 & obj;
    ~ok2(){cout << "delete ok2" << endl;}
};
int main()
{
    ok2 a(ok1(100));
    cout << a.obj.val << endl;
    system("pause");
    return 0;
}
P.S. Заранее благодарен.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2012, 17:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Удаляется объект когда не требуется и всё равно продолжает существовать (C++):

сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного - зачем всё это? в смысле, можно же без этого? так зачем жизнь усложнять? - C++
сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного - зачем всё это? в смысле, можно же без этого? так зачем жизнь...

окно всё равно закрывается.... - C++
Всем доброго времени суток! прочитал тему тут понял что в конце программы необходимо добавить функцию getchar(); написал программку: ...

Почему удаляется объект? - C++
Помогите, пожалуйста, понять почему удаляется объект и как это исправить? Идея следующая: В Source.cpp я создаю два объекта, вызывая...

Объект удаляется до возвращения его из функции - C++
Есть следующий код перегрузки операции &quot;+&quot; для сложения матриц: Matrix operator+(const Matrix &amp;x) { Matrix result(*this); ...

удаляется ли объект или происходит утечка памяти? - C++
Добрый день, подскажите, при таком коде, удаляется ли объект или происходит утечка памяти? std::list&lt;A*&gt; entities; ...

Созданный объект Array<char> удаляется, как только метод convert завершается - C++
Есть простенькая оболочка над массивом Array&lt;T&gt;: template&lt;typename T&gt; class Array { private: T* data; public: const...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
16.07.2012, 17:10 #2
C++
1
ok2 a(ok1(100));
Вы создаете объект ok2 передавая ссылку на временный объект, после передачи ссылки, объект удаляется, это UB если я не ошибаюсь.
0
mamucho666
1 / 1 / 0
Регистрация: 06.06.2012
Сообщений: 13
16.07.2012, 17:32  [ТС] #3
То есть аргументы удаляются так же как и параметры? Не знал, хотя догадывался. Но это можно принять. Остаётся вопрос - почему я всё равно могу пользоваться объектом?
0
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
16.07.2012, 17:49 #4
mamucho666, это вообще компилируется? В конструктор вы передаете временный объект, хотя он должен принимать ссылку.
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
16.07.2012, 17:52 #5
mamucho666, Всмысле удаляются так же как параметры? Что происходит в вашем коде.
1) Вызывается конструктор ok1.
2) Вызывается конструктор ok2 и передается ссылка на ранее созданный ok1.
3) Так как объект ok1 временный - вызывается деструктор ok1.

Следовательно ok2 уже не должен обращаться к этим данным, т.к. иначе это undefined behaviour.
И кстати внятный компилятор скажет об этом, пример - http://liveworkspace.org/code/ceaf31...db8d05f3208eb3
0
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
16.07.2012, 18:15 #6
ИМХО, никакого UB тут нет. Временный объект - rvalue. Ссылочный объект - lvalue. Как ТС хочет, чтобы rvalue преобразовалось в lvalue?
1
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
16.07.2012, 18:18 #7
soon, На самом деле да, я ступил, но вопрос почему у ТС это компилируется, ведь раз он показывает вывод - значит он смог это запустить.
0
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
16.07.2012, 18:23 #8
ForEveR, я вначале даже подумал, что ТС переписывал код на форум вручную и вместо rvalue reference написал просто reference. В таком случае, вывод действительно будет как у ТС.
0
mamucho666
1 / 1 / 0
Регистрация: 06.06.2012
Сообщений: 13
16.07.2012, 18:28  [ТС] #9
Компилятор майкрософтовский, 2010. И да, soon прав.

Наверно компилятор как-то сам исправил, но он даже предупреждения не выдаёт(

А можно как-то посмотреть во что он превратил код? То есть посмотреть какую-то информацию о том что сейчас в программе происходит? Что создаётся, что удаляется и тд и тп.
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
16.07.2012, 18:30 #10
О как. В 2012 RC студии оно тоже работает и дает тот же вывод что у ТС.
0
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
16.07.2012, 18:33 #11
поставте уровень ворнингов проекта на максимум. вот что 2008 студия выдает:
warning C4239: nonstandard extension used : 'argument' : conversion from 'Obj' to 'Obj &' A non-const reference may only be bound to an lvalue
0
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
16.07.2012, 18:36 #12
Но это же бред. Временный объект может кастоваться разве что в const & и &&. ТС, ForEveR, попробуйте скомпилить это
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
#include <iostream>
 
using namespace std;
 
struct ok1
{
    ok1(int i):val(i){cout << "ok1" << endl;}
    int val;
    ~ok1(){cout << "delete ok1" << endl;}
};
struct ok2
{
    ok2 (ok1 & refobj):obj(refobj){cout << "ok2" << endl;}
    ok1 & obj;
 
    void setOk1(const ok1& k)
    {
        obj = k
    }
 
    ~ok2(){cout << "delete ok2" << endl;}
};
int main()
{
    ok2 a(ok1(100));
    cout << a.obj.val << endl;
    ok1 k(1);
    a.setOk1(k);
    // system("pause");
    return 0;
}
Может он ссылку в const запихивает.
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
16.07.2012, 18:36 #13
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
#include <iostream>
 
using std::cout;
using std::endl;
 
struct ok1
{
    ok1(int i):val(i){cout << "ok1" << endl;}
    int val;
    ~ok1(){cout << "delete ok1" << endl;}
};
struct ok2
{
    ok2 (volatile ok1 & refobj):obj(const_cast<ok1&>(refobj)){cout << "ok2" << endl;}
    ok1 & obj;
    ~ok2(){cout << "delete ok2" << endl;}
};
int main()
{
    ok2 a(ok1(100));
    cout << a.obj.val << endl;
    system("pause");
    return 0;
}
Ошибка 1 error C2664: ok2::ok2(volatile ok1 &): невозможно преобразовать параметр 1 из "ok1" в "volatile ok1 &" c:\users\forever\documents\visual studio 11\projects\consoleapplication1\consoleapplication1\create.cpp 20 1 ConsoleApplication1

А вот так он дает то что нужно, сдается мне что он вместо ссылки поставляет rvalue-ссылку или const-ссылку.

soon, твой код откомпилировался.
0
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
16.07.2012, 18:42 #14
Цитата Сообщение от ForEveR Посмотреть сообщение
А вот так он дает то что нужно, сдается мне что он вместо ссылки поставляет rvalue-ссылку или const-ссылку.
Хм. Тогда, ТС, попробуйте изменить refobj в конструкторе.

Добавлено через 2 минуты
Хотя все равно не понятно, как он const & будет преобразовывать в &, поскольку не известно, что находится pз const &. Если все пройдет гладко - налицо нарушение стандарта. На это указывает, кстати, и вывод DU
Цитата Сообщение от DU Посмотреть сообщение
nonstandard extension
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
16.07.2012, 18:42 #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
#include <iostream>
 
using namespace std;
 
struct ok1
{
    ok1(int i):val(i){cout << "ok1" << endl;}
    int val;
    ~ok1(){cout << "delete ok1" << endl;}
};
 
struct ok2
{
    ok2 (ok1 & refobj):obj(refobj){cout << "ok2" << endl; refobj.val = 5;}
    ok1 & obj;
 
    ~ok2(){cout << "delete ok2" << endl;}
};
 
int main()
{
    ok2 a(ok1(100));
    cout << a.obj.val << endl;
    return 0;
}
Вывод 5.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2012, 18:42
Привет! Вот еще темы с ответами:

После удаления (перезаписи) данных из бинарного файла, файл всё равно существует, несмотря на то, что он пуст - C++
после удаления(перезаписи) данных из бинарного файла, файл всё равно существует, как сделать так чтобы и файл удалялся если он пустой?

Зачем нужно освобождать память динамических объектов в деструкторе, если всё равно это сделает менеджер памяти - C++
Не скажу за все ОС-и, но под Windows есть менеджер памяти. Когда по ходу кода встречается new, ну или что - то другое для алокации...

Почему процесс продолжает существовать после закрытия окна? - VBA
1. К MS Access 2000 подключил COM Add-in написанный на VBA. При соединении Add-in'а вызывается функция addin_onconnection с параметрами,...

Домен после удаления продолжает существовать, как его удалить? - RedHat, Fedora Linux
Я слаб в линуксе, обычно все делаю через админ-панель. Тут заметил, что Яндекс видит один из веб-сайтов под вообще другим доменом, который...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.07.2012, 18:42
Ответ Создать тему
Опции темы

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