Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Получение ссылки на экземпляр класса...
|
|||
|---|---|---|---|
|
#18+
MS VS 2017 (CE). Добрый день. Попался код, в котором в цикле заполняется массив указателей на объекты типа MyClass: Класс MyClass: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Заполнение массива указателей: Код: plaintext 1. 2. 3. 4. 5. 6. При работе выяснилось, что после выхода из цикла for(), массив mc заполнен одинаковыми значениями: указателями на экземпляр класса, значения полей которого соответствует последней итерации цикла for(). Посмотрел в отладчике, что в цикле for() всякий раз вызывается конструктор MyClass(параметры), но значение this в нем одно и то же. "Проблема" решилась после замены Код: plaintext 1. на Код: plaintext 1. Однако, остался вопрос насчет поведения поведения в случае исходного варианта: Код: plaintext 1. Поясните, пожалуйста - что происходит, отчего каждый раз создается экземпляр класса по одному и тому же адресу. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2018, 21:34 |
|
||
|
Получение ссылки на экземпляр класса...
|
|||
|---|---|---|---|
|
#18+
экземпляр MyClass создается на стеке и живет ровно одну итерацию for, после чего представляет из себя мусор ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2018, 21:58 |
|
||
|
Получение ссылки на экземпляр класса...
|
|||
|---|---|---|---|
|
#18+
Cerebrumэкземпляр MyClass создается на стеке... Спасибо, а из чего сие следует? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2018, 22:10 |
|
||
|
Получение ссылки на экземпляр класса...
|
|||
|---|---|---|---|
|
#18+
Cerebrumэкземпляр MyClass создается на стеке и живет ровно одну итерацию for, после чего представляет из себя мусор он живет до выхода из блока {} но это единственный экземпляр, так что вполне логично получить N одинаковых указателей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2018, 22:53 |
|
||
|
Получение ссылки на экземпляр класса...
|
|||
|---|---|---|---|
|
#18+
эквивалентный код Код: plaintext 1. 2. 3. 4. 5. наверно, технически на разных итерациях это разные ekz, но они будут как братья и на одном адресе стека ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2018, 22:56 |
|
||
|
Получение ссылки на экземпляр класса...
|
|||
|---|---|---|---|
|
#18+
и по выходу из for() уничтожатся, так что потом там будет мусор, указатели на стек протухнут ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2018, 22:57 |
|
||
|
Получение ссылки на экземпляр класса...
|
|||
|---|---|---|---|
|
#18+
SiemarglCerebrumэкземпляр MyClass создается на стеке и живет ровно одну итерацию for, после чего представляет из себя мусор он живет до выхода из блока {} но это единственный экземпляр, так что вполне логично получить N одинаковых указателей Конструкция Код: plaintext 1. - возвращает ссылку на экземпляр, созданный именно на стеке? Что-то никак не припомню, где про место выделения памяти для такой формы написано. Подскажите, где про это можно подробнее почитать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2018, 22:58 |
|
||
|
Получение ссылки на экземпляр класса...
|
|||
|---|---|---|---|
|
#18+
Котовасия- возвращает ссылку на экземпляр, созданный именно на стеке? Что-то никак не припомню, где про место выделения памяти для такой формы написано. Подскажите, где про это можно подробнее почитать. Ты выделил память на массив указателей, потом разименовал каждый и присвоил им адрес созданного на стеке объекта. Код: plaintext 1. ссылка это Код: plaintext 1. а операция & в твоем случае тебе возвращает адрес только что созданного в итерации MyClass-объекта, а не ссылку на него ты просто перепутал место & ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2018, 23:45 |
|
||
|
Получение ссылки на экземпляр класса...
|
|||
|---|---|---|---|
|
#18+
Фишка тут в том, что язык позволяет создавать объекты не присваивая им имен. Например, если тебе надо вызвать функцию с параметром MyClass Код: plaintext 1. 2. 3. 4. 5. но ты вправе сделать и так Код: plaintext 1. это тоже самое что и в первом случае за тем лишь исключением, что ты больше нигде в коде после foo НЕ сможешь обратиться к созданному экземпляру MyClass. Он будет уничтожен сразу же после того, как foo вернет управление. В твоем коде ты создал такой экземпляр MyClass и тут же получил его адрес c помошью & твой код равносилен такому Код: plaintext 1. 2. исходя из того, что я написал выше про создание объектов без имени - выкини x и замени его MyClass и получишь в точности что у тебя ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2018, 23:58 |
|
||
|
Получение ссылки на экземпляр класса...
|
|||
|---|---|---|---|
|
#18+
Cerebrum, ОК, спасибо. зы: вспомнил, где я все же читал про такое: в пиимерах к описанию конструкторов копирования! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2018, 06:03 |
|
||
|
Получение ссылки на экземпляр класса...
|
|||
|---|---|---|---|
|
#18+
Ночь не спал, думал не ошибся ли я - нет http://tpcg.io/KHNZmi PS. Добрый gcc не дает выстрелить в ногу - error: taking address of temporary [-fpermissive] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2018, 09:19 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=16&tid=2017737]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
52ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
| others: | 13ms |
| total: | 162ms |

| 0 / 0 |
