1 / 1 / 0
Регистрация: 06.06.2012
Сообщений: 13
|
||||||
1 | ||||||
Удаляется объект когда не требуется и всё равно продолжает существовать16.07.2012, 17:07. Показов 1975. Ответов 24
Метки нет (Все метки)
Всем привет. Честно говоря я не знаю как ещё более правильно описать проблему в заголовке. В общем проходил раздел, посвящённый <functional>, и, собственно, там всё понятно, но заметил одну странность, потом перепроверил в специально написанном для проверки более простом коде и она подтвердилась.
Код ниже выводит на экран вот эти надписи: ok1 ok2 delete ok1 100 delete ok2 Вопросы мои по поводу выделенных жирным. 1. Зачем удаляется объект класса ок1 до завершения функции в которой он создан? 2. Если он удалился, то откуда тогда взялся доступ к члену этого объекта?
0
|
16.07.2012, 17:07 | |
Ответы с готовыми решениями:
24
Confirm - при нажатии на cancel объект всё равно удаляется Почему процесс продолжает существовать после закрытия окна? Домен после удаления продолжает существовать, как его удалить? Когда делаю Float left пропадает фон у родительского элемента, точнее он есть но браузеру на него все равно |
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
16.07.2012, 17:10 | 2 | |||||
0
|
1 / 1 / 0
Регистрация: 06.06.2012
Сообщений: 13
|
|
16.07.2012, 17:32 [ТС] | 3 |
То есть аргументы удаляются так же как и параметры? Не знал, хотя догадывался. Но это можно принять. Остаётся вопрос - почему я всё равно могу пользоваться объектом?
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
16.07.2012, 17:52 | 5 |
mamucho666, Всмысле удаляются так же как параметры? Что происходит в вашем коде.
1) Вызывается конструктор ok1. 2) Вызывается конструктор ok2 и передается ссылка на ранее созданный ok1. 3) Так как объект ok1 временный - вызывается деструктор ok1. Следовательно ok2 уже не должен обращаться к этим данным, т.к. иначе это undefined behaviour. И кстати внятный компилятор скажет об этом, пример - http://liveworkspace.org/code/... 05f3208eb3
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
16.07.2012, 18:18 | 7 |
soon, На самом деле да, я ступил, но вопрос почему у ТС это компилируется, ведь раз он показывает вывод - значит он смог это запустить.
0
|
1 / 1 / 0
Регистрация: 06.06.2012
Сообщений: 13
|
|
16.07.2012, 18:28 [ТС] | 9 |
Компилятор майкрософтовский, 2010. И да, soon прав.
Наверно компилятор как-то сам исправил, но он даже предупреждения не выдаёт( А можно как-то посмотреть во что он превратил код? То есть посмотреть какую-то информацию о том что сейчас в программе происходит? Что создаётся, что удаляется и тд и тп.
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
16.07.2012, 18:30 | 10 |
О как. В 2012 RC студии оно тоже работает и дает тот же вывод что у ТС.
0
|
1500 / 1146 / 165
Регистрация: 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
|
16.07.2012, 18:36 | 12 | |||||
Но это же бред. Временный объект может кастоваться разве что в const & и &&. ТС, ForEveR, попробуйте скомпилить это
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
16.07.2012, 18:36 | 13 | |||||
А вот так он дает то что нужно, сдается мне что он вместо ссылки поставляет rvalue-ссылку или const-ссылку. soon, твой код откомпилировался.
0
|
16.07.2012, 18:42 | 14 |
Хм. Тогда, ТС, попробуйте изменить refobj в конструкторе.
Добавлено через 2 минуты Хотя все равно не понятно, как он const & будет преобразовывать в &, поскольку не известно, что находится pз const &. Если все пройдет гладко - налицо нарушение стандарта. На это указывает, кстати, и вывод DU
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
16.07.2012, 18:42 | 15 | |||||
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
16.07.2012, 18:45 | 17 |
Да-с, нарушение стандарта. 1>c:\users\forever\documents\visual studio 11\projects\consoleapplication1\consoleapplication1\create.cpp(22): warning C4239: нестандартное расширение: аргумент: преобразование "ok1" в "ok1 &"
К слову 10-ка тоже была с rvalue-ref насколько я помню.
0
|
1 / 1 / 0
Регистрация: 06.06.2012
Сообщений: 13
|
||||||
16.07.2012, 19:01 [ТС] | 19 | |||||
Вы меня просите о чём я понятия не имею. Что значит изменить refobj?
Если вы не против, скиньте мне просто готовый код, который надо скомпилить. У меня пока вопрос возник, почему в коде ok(a) выдаёт ошибку, при чём вообще непонятную ( (11): error C2371: a: переопределение; различные базовые типы (10): см. объявление "a" (11): error C2512: ok: нет подходящего конструктора по умолчанию), ) а создание именованного объекта ok b(a) проходит успешно?
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|||||||||||
16.07.2012, 19:05 | 20 | ||||||||||
soon, Даже стало интересно, как-то вообще можно проверить каким образом компилятор делает такое корректным? По сути тест case какой-то такой
Добавлено через 53 секунды
0
|
16.07.2012, 19:05 | |
16.07.2012, 19:05 | |
Помогаю со студенческими работами здесь
20
Говорит что объект есть, но в коде точно видно что объект удаляется Объект браузера продолжает хранить старую версию загруженного файла Не удаляется объект Почему удаляется объект? Не удаляется объект из памяти Не удаляется объект из списка Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |