15 / 15 / 3
Регистрация: 04.07.2013
Сообщений: 76
|
||||||
1 | ||||||
Интересная инициализация ссылки06.07.2013, 22:06. Показов 1700. Ответов 19
Метки нет (Все метки)
Доброго времени суток.
Рассмотрим вот такой код:
0
|
06.07.2013, 22:06 | |
Ответы с готовыми решениями:
19
Инициализация ссылки Инициализация ссылки в методе Что такое инициализация сегментов или инициализация регистров? Как заменить все ссылки на текст кроме ссылки моего сайта? |
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
06.07.2013, 22:09 | 2 |
это код с неопределенным поведением и скорее всего крашем.
синтаксически все верно. но в рантайме начнутся проблемы, т.к. тут попытка обратится к члену какого-то объекта через нулевой указатель.
1
|
15 / 15 / 3
Регистрация: 04.07.2013
Сообщений: 76
|
|
06.07.2013, 22:11 [ТС] | 3 |
DU, lда, это я уже проверил - дамп памяти получился. но если не обращаться к этому элементу, то все вроде бы ок. я вот хотел бы уточнить, не чревато ли это утечками какими-нибудь, если код оставить как есть, но не обращаться к элементу vec_ref, инициализированному как показано выше?
0
|
06.07.2013, 22:12 | 4 |
Нет, так и в коде этого тоже нет.
Ну да, ссылка на вектор инициализируется вектором. Что не так? Не на сколько, он же в рантайме сломается
0
|
15 / 15 / 3
Регистрация: 04.07.2013
Сообщений: 76
|
|
06.07.2013, 22:14 [ТС] | 5 |
0
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
06.07.2013, 22:19 | 8 |
ну есть негласное правило, когда лучше ссылки использовать, а когда указатели.
если ваш класс может корректно работать в случае, когда ему передадут нулевой указатель (типа специально предусмотрена такая возможность для какого-нибудь там дефолтного поведения) - то передаем в него указатель. если не может (в вашем случае - не может. т.к. внутренний член инициализируется членом, получаемым от переданного в конструктор объекта), то тут лучше воспользоваться ссылкой, т.к. ссылки вроде как как всегда ссылаются на какой-то объект. "вроде как" - это не всегда так, но в этом случае ответственность на вызывающей стороне. она должна следить, чтобы в конструктор приходила ссылка на существующий объект. т.о., использование ссылки вместо указателя намекает вызывающей стороне что сюда нужно отдавать что-то существующее, иначе сам дурак.
0
|
15 / 15 / 3
Регистрация: 04.07.2013
Сообщений: 76
|
|
06.07.2013, 22:34 [ТС] | 9 |
Croessmah, жаль, лучше бы уж компилятор ругался в таких случаях
Добавлено через 11 минут смущает, конечно) поэтому и тему создал Добавлено через 3 минуты DU, если vec_ref будет не ссылкой, а указателем, от этого что-то принципиально изменится в рантайме?
0
|
06.07.2013, 22:38 | 10 |
Так оно сломается в момент обращения по nullptr, т.е. еще до инициализации ссылки.
Добавлено через 45 секунд нет, просто в этом случае оно упадет в момент инициализации указателя, а не в момент инициализации ссылки
0
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
06.07.2013, 22:44 | 11 |
нет. не будет. ссылки и указатели транслируются компилятором в один и тот же бинарный код.
на счет сломается - не факт. поскольку Obj* obj = &superOjbPtr->obj - это не изменяющее обращение. т.к. компилятор знает, смещение в памяти объекта obj относительно объекта superObj и в данном случае мы получаем указатель на obj, то компилятор может просто сгенерировать код obj = superObjPtr + смещение = 0 + смещение. т.е. тут арифметика указателей вполне может оказаться так, что ничего не случится. а вот при попытке изменить obj за счет вызова какого-нибудь метода или просто изменить, если это какой-нибудь инт, вот тут будут проблемы, т.к. obj указывает хз куда.
1
|
06.07.2013, 22:52 | 12 |
Ну да, так оно и будет, только адрес получится очень маленьким (если только смещение не равно паре гигов ), а в современных десктопных ОСях это тоже недопустимо. Может под какое-нибудь специфичное устройство со специфичной ОСью это и будет работать (всмысле не скрэшится), но винда и линукс на х86 выкинут исключение.
P.S. хотя замечание в целом верное, я что-то неподумав написал.
0
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
||||||
06.07.2013, 22:55 | 13 | |||||
вот тестик в 2012 студии. инициализация через нулевой указатель не крашится. крашится попытка изменения.
address of struct = 0x00000008 address of struct = 0x00000008
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
06.07.2013, 23:00 | 15 |
Может. Но стать NULL она не может, а только быть изначально. И поменяться может только NULL ссылка.
0
|
15 / 15 / 3
Регистрация: 04.07.2013
Сообщений: 76
|
||||||
06.07.2013, 23:29 [ТС] | 16 | |||||
Всем большое спасибо за ответы.
В целом, предыстория вопроса такова. Такая конструкция используется для моделирования последовательности объектов конвейерного типа. v_ref - это входные данные в узел, полученные от предыдущего узла, v - выходное данные текущего узла, полученные как результат обработки v_ref. Таким образом, самый первый узел в очереди не имеет v_ref как результат работы предыдущего узла, т.е. ни на что не ссылается и не обрабатывается. Дело в том, что приведенный в начале темы код писался не мной. Лично я бы написал нечто подобное:
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
06.07.2013, 23:32 | 17 |
Нет, это дешёвая русская подделка.
0
|
15 / 15 / 3
Регистрация: 04.07.2013
Сообщений: 76
|
|
06.07.2013, 23:34 [ТС] | 18 |
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
06.07.2013, 23:37 | 19 |
Ну настоящие индусы делают более тупые ошибки, так что это не индусский код, а очень кривая его русская имитация.
0
|
15 / 15 / 3
Регистрация: 04.07.2013
Сообщений: 76
|
|
06.07.2013, 23:38 [ТС] | 20 |
taras atavin, теперь понял)
0
|
06.07.2013, 23:38 | |
06.07.2013, 23:38 | |
Помогаю со студенческими работами здесь
20
Зачем нужны rvalue ссылки, если есть универсальные ссылки Загрузка файла на сервер, добавление в базу данных ссылки и вывод ссылки из базы Как достать ссылки из Memo1 в Memo2 ссылки только которые оканчиваются на *.jpg *.gif Ссылки с параметрами, Как передать параметры ссылки в javascript? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |