|
Получение ссылки на экземпляр класса...
|
|||
---|---|---|---|
#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: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 147ms |
0 / 0 |