Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
Коллеги помогите пожалуйста Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Есть вот такой код Результат - вот такая печать created released finished released Подскажите как сделать так чтобы деструктор (released) не вызывался 2 раза - это же вроде как некорректно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 12:08 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
semen.s.semen, у тебя для каждого экземпляра test деструктор вызывается единожды - для экземпляра в map и для экземпляра на стеке (test t). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 12:16 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
Как это я же создаю 1 объект test t{}; и кладу его в мап ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 12:18 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
semen.s.semenКак это я же создаю 1 объект test t{}; и кладу его в мап 1) создаёшь экземпляр где? 2) глагол "кладу" - расшифруй для себя (можно глняуть отладчиком что происходит, только с заходом в саму мапу) именно про это те и сказали выше. (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 12:28 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
test t{}; Создаю на стеке aMap->emplace(s, t); Неужели конструктор копирования вызывается ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 12:30 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
semen.s.semen, а как же?! Если ты явно не указал на отсутствие реализации конструктора копирования, он будет создан по умолчанию с реализацией простого копирования байт-в-байт. И вообще - создавать на стеке экземпляры класса, а потом помещать их в map, созданный в куче - моветон. Делай так: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 13:01 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
Я маленько наврал. :) Метод emplace принимает ссылки на rvalue: Код: plaintext 1. 2. Поэтому, надо делать что-то типа: Код: plaintext 1. В этом случае, на стеке будет создан временный экземпляр класса test, а при передаче в map будет задействован либо конструктор копии, либо конструктор пересылки, в зависимости от того, реализованы ли эти конструкторы для класса. Это то, о чем писалось в другой ветке - RVO/NRVO. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 13:24 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
semen.s.semenКоллеги помогите пожалуйста Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Есть вот такой код Результат - вот такая печать created released finished released Подскажите как сделать так чтобы деструктор (released) не вызывался 2 раза - это же вроде как некорректно У тебя всё нормально с деструкторами. У тебя ненормально с конструкторами. Ты не всех их "трассируешь". У тебя в коде вызывается MOVE-конструктор, который ты не замечаешь, игнорируешь, а потом думаешь (неверно), что деструктор вызывается лишний раз. http://en.cppreference.com/w/cpp/container/map/emplace ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 13:28 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
semen.s.sementest t{}; Создаю на стеке aMap->emplace(s, t); Неужели конструктор копирования вызывается ? Ну да, или он. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 13:29 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
rdb_devsemen.s.semen, а как же?! Если ты явно не указал на отсутствие реализации конструктора копирования, он будет создан по умолчанию с реализацией простого копирования байт-в-байт. И вообще - создавать на стеке экземпляры класса, а потом помещать их в map, созданный в куче - моветон. Делай так: Код: plaintext 1. Ты хотел написать НЕ ДЕЛАЙ так ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 13:29 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
rdb_devsemen.s.semen, а как же?! Если ты явно не указал на отсутствие реализации конструктора копирования, он будет создан по умолчанию с реализацией простого копирования байт-в-байт. Нет, implicit конструкторы копирования ничего не копируют байт-в байт. Это -- расхожий среди новичков миф о С++. Дефолтный конструктор копирования вызывает копирование предков, затем почленное копирование всех мемберов. Никакого копирования байт-в байт не происходит никогда. авторИ вообще - создавать на стеке экземпляры класса, а потом помещать их в map, созданный в куче - моветон. Не выдумывай ерунду. Ты не на Java пишешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 13:32 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
semen.s.semen, А зачем вообще map создавать в куче? Если уж создал, то и подчистить за собой надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 13:53 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
MasterZiv, ненаследованные (собственные) члены конструктор копирования по умолчанию может и обычным копированием сделать через MOVSB, задав в регистрах #SI и #DI источник и приемник соответственно, а в регистре #CX - кол-во байт. Конечно, зависит от конкретной реализации компилятора. Кстати, обращал внимание, как сейчас компиляторы помещают в стек параметры? Никаких тебе множественных PUSH! :) Сразу грузит в #SP значение с учётом смещения для всех параметров, формируя кадр стека и помещает туда параметры обычным MOV. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 13:58 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
MasterZivТы хотел написать НЕ ДЕЛАЙ так ?Я чуть ниже исправился. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 13:58 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
MasterZivУ тебя в коде вызывается MOVE-конструктор, который ты не замечаешь, игнорируешь, а потом думаешь (неверно), что деструктор вызывается лишний раз.Конструктор пересылки, в отличие от конструктора копии, не создается по умолчанию - необходима явная реализация. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 14:01 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
semen.s.semenПодскажите как сделать так чтобы деструктор (released) не вызывался 2 раза - это же вроде как некорректно Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 14:35 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
AmKadsemen.s.semenПодскажите как сделать так чтобы деструктор (released) не вызывался 2 раза - это же вроде как некорректно Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. Код: plaintext 1. 2. Интересно А в данном случае std::move(t) не приведет к вызову конструктора и созданию еще одного объекта ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 14:48 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
rdb_devMasterZiv, ненаследованные (собственные) члены конструктор копирования по умолчанию может и обычным копированием сделать через MOVSB, задав в регистрах #SI и #DI источник и приемник соответственно, а в регистре #CX - кол-во байт. Конечно, зависит от конкретной реализации компилятора. Кстати, обращал внимание, как сейчас компиляторы помещают в стек параметры? Никаких тебе множественных PUSH! :) Сразу грузит в #SP значение с учётом смещения для всех параметров, формируя кадр стека и помещает туда параметры обычным MOV. Почему ты выдумываешь всё время? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 15:03 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
rdb_devMasterZivУ тебя в коде вызывается MOVE-конструктор, который ты не замечаешь, игнорируешь, а потом думаешь (неверно), что деструктор вызывается лишний раз.Конструктор пересылки, в отличие от конструктора копии, не создается по умолчанию - необходима явная реализация. Опять фантазии? Он В ДАННОМ КОНКРЕТНОМ случае не создаётся, потому что деструктор объявлен. Да, это я прошляпил. Тогда должен использоваться конструктор копирования (который есть всегда если move не объявишь). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 15:07 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
rdb_dev, в этой книжке Эффективный и современный С++. 42 рекомендации по использованию C++11 и C++14 написано как устроен std::move. Он "работает" во время компиляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 15:08 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
semen.s.semenА в данном случае std::move(t) не приведет к вызову конструктора и созданию еще одного объекта ? std::move вообще ничего не делает. Как он может создавать объект? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 15:09 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
Dima Trdb_dev, в этой книжке Эффективный и современный С++. 42 рекомендации по использованию C++11 и C++14 написано как устроен std::move. Он "работает" во время компиляции. Он просто ссылку преобразует в rvalue-ссылку, если это возможно. И всё. А далее что-то либо копирует из rvalue-ссылки, либо перемещает. Как может. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 15:11 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
semen.s.semenА в данном случае std::move(t) не приведет к вызову конструктора и созданию еще одного объекта ?Нет. Происходит передача указателя на уже выделенный участог памяти. После передачи указателя ф-ия main им уже не владеет. Исключительные права передаются map-объекту. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 15:12 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
AmKadsemen.s.semenА в данном случае std::move(t) не приведет к вызову конструктора и созданию еще одного объекта ?Нет. Происходит передача указателя на уже выделенный участог памяти. После передачи указателя ф-ия main им уже не владеет. Исключительные права передаются map-объекту. И зачем ты туда new всобачил? Чтобы запутать ещё больше? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 15:17 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
MasterZivAmKadпропущено... Нет. Происходит передача указателя на уже выделенный участог памяти. После передачи указателя ф-ия main им уже не владеет. Исключительные права передаются map-объекту. И зачем ты туда new всобачил? Чтобы запутать ещё больше? Уважаемый Мастер Зив Привидите пожалуйста Ваш корректно работающий вариант кода с использованием std::move ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 15:18 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39632489&tid=2017880]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
58ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 171ms |

| 0 / 0 |
