2 / 2 / 0
Регистрация: 16.02.2011
Сообщений: 36
|
|||||||||||
1 | |||||||||||
Почему создаются новые объекты?19.02.2011, 01:03. Показов 2061. Ответов 21
Метки нет (Все метки)
Всем доброго времени суток!
Я не могу понять где создаются новые объекты Есть у меня простенький класс
Зачем компилятор создет еще один экземпляр класса data что бы просто передать *this ? Если кто понимает, то объясните пожалуйста.
0
|
19.02.2011, 01:03 | |
Ответы с готовыми решениями:
21
Создаются одинаковые объекты Классы: Не создаются объекты класса Apple Объекты каких потоков автоматически создаются при запуске программы Написать программу, в которой создаются и разрушаются объекты, определенного пользователем класса |
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
19.02.2011, 01:07 | 2 |
Потому что вы возвращаете не ссылку, а объект типа data. Чтобы вернуть объект, надо его скопировать в точку вызова, а потом удалить (тот, что был в функции). И компилятору пофиг, что это *this и что после выхода из функции он не уничтожится - вы ему сказали возвращать объект - он это и делает.
0
|
2 / 2 / 0
Регистрация: 16.02.2011
Сообщений: 36
|
||||||
19.02.2011, 09:50 [ТС] | 3 | |||||
Я не понял.
Какой удаляется объект? Кстатиб такой код тоже вызывет деструктор 1 раз (при присваивании)
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
19.02.2011, 10:16 | 4 |
OMGHero, вы для того, чтобы вернуть объект, создаёте временный, а именно data (str). При возврате объекта вызывается конструктор копии, который копирует этот временный объект в точку вызова, чтобы он стал результатом операции присваивания. Но в функции ведь осталась изначальная копия этого объекта, и при выходе из функции все локальные переменные должны быть уничтожены, следовательно, будет вызван деструктор для этого временного объекта, который был создан в функции как data (str).
0
|
2 / 2 / 0
Регистрация: 16.02.2011
Сообщений: 36
|
||||||
19.02.2011, 10:32 [ТС] | 5 | |||||
Не понятно что тут создается:
0
|
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,590
|
||||||||||||||||
19.02.2011, 10:35 | 6 | |||||||||||||||
Временный. Который программа создаст для того, чтобы передать копию *this в
Кстати, некорректно работаете со строками. Вот пример, в котором никто никуда лишний раз не удаляется и содержимое класса Data передается по ссылке:
0
|
2 / 2 / 0
Регистрация: 16.02.2011
Сообщений: 36
|
|||||||||||
19.02.2011, 11:00 [ТС] | 7 | ||||||||||
lemegeton, а почему так копируете строки
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
||||||||||||||||
19.02.2011, 13:24 | 8 | |||||||||||||||
В случае
Добавлено через 3 минуты Очень хочется получить сообщение 4 раза - пишите так:
1
|
2 / 2 / 0
Регистрация: 16.02.2011
Сообщений: 36
|
|
19.02.2011, 13:32 [ТС] | 9 |
Понял )
Добавлено через 7 минут Этот код вызывает один раз деструктор. Проверьте.
0
|
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,590
|
||||||
19.02.2011, 13:54 | 10 | |||||
Ну, во-первых, такое присваивание строк deprecated, во-вторых, чтобы иметь копию значения, а не ссылку на него.
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
19.02.2011, 14:01 | 11 |
OMGHero, проверил. Вывод
Код
data deleted data deleted data deleted data deleted Вообще говоря полезно пробежаться по коду трассировщиком и воочию убедиться, что и где вызывается. Мне очень нравится трассировщик у MSVS2010, им и пользуюсь. Только что специально ради вас прогнал код - вызовы деструкторов: при выходе из функции operator=, до возврата значения, после возврата значения при выходе из main (для удаления d1), при выходе из main (для удаления d2) В main у меня были созданы только два объекта, чтобы проверить присваивание.
1
|
2 / 2 / 0
Регистрация: 16.02.2011
Сообщений: 36
|
|
19.02.2011, 14:07 [ТС] | 12 |
странно, у меня только один раз (без учета удаления объектов d1 и d2)
щас буду разбираться
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
||||||
19.02.2011, 14:19 | 13 | |||||
Если интересно, вот код (вдруг вы чего у себя не поменяли или ещё что):
Код
Hello World data deleted data deleted World World data deleted data deleted Ещё для наглядности добавил конструктор копии, чтобы при трассировке видеть, когда он вызывается, на работу деструкторов он, естественно, не влияет.
1
|
19.02.2011, 14:26 | 14 | |||||
silent_1991, а я обычно смотрю примерно вот так
код и результат
Код
create of sample object: 001BFE8F create of sample object: 001BFE83 create of sample object: 001BFE77 destroy of sample object: 001BFE77 destroy of sample object: 001BFE83 destroy of sample object: 001BFE8F
2
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
19.02.2011, 14:32 | 15 |
fasked, не, старый добрый метод принтэфной отладки, конечно, никто не отменял))) Но мне как-то в последнее время удобно пользоваться трассировщиком, тем более что мелкомягкие в этот раз действительно на славу постарались)))
0
|
2 / 2 / 0
Регистрация: 16.02.2011
Сообщений: 36
|
|
19.02.2011, 14:33 [ТС] | 16 |
silent_1991, не могли бы вы дать ссылку на мануал где этот трассировщик в visual studio. я его до этого никогда не использовал. В гугле Ip трассировщики вылазают
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
19.02.2011, 14:40 | 17 |
OMGHero, вы просто жмёте F10 или F11 и пошагово прогоняете программу. Внизу появится окно трассировки с отображением значений всех переменных, а маркер будет указывать на строку, которая выполняется. При этом F10 - шаг с обходом (например, пропуск функции, т.е. функция фактически будет вызвана и выполнена, но отображено это не будет и произойдёт переход на следующую строку), а F11 - шаг с заходом - подробная трассировка, будет выполнен заход всюду, куда только можно.
0
|
2 / 2 / 0
Регистрация: 16.02.2011
Сообщений: 36
|
|
19.02.2011, 14:47 [ТС] | 18 |
а как увидеть какие объекты создаются ? например как увидеть какой объект создается при возврате функцией *this ?
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
19.02.2011, 14:52 | 19 |
OMGHero, ну это ведь временный объект, имени у него нет. Потому он не будет отображаться в списке переменных. Но по-моему и так понятно, что это тот самый временный объект, который возвращается в точку вызова (потому что он удаляется после вызова return, но до выхода из функции).
0
|
2 / 2 / 0
Регистрация: 16.02.2011
Сообщений: 36
|
|
19.02.2011, 15:00 [ТС] | 20 |
silent_1991, Вот результат вашего кода у меня. Наверное разница в компиляторах, может мой что-то соптимизировал и не стал создавать еще один объект. Пользуюсь Visual Studio 2010
Код
Hello World data deleted World World data deleted data deleted
0
|
19.02.2011, 15:00 | |
19.02.2011, 15:00 | |
Помогаю со студенческими работами здесь
20
Не создаются новые потоки при распараллеливании цикла for (работает только один поток - главный) Написать программу, в которой создаются и уничтожаются объекты класса "Library", определенного пользователем Почему при программировании C++/Win32 создаются элементы старого вида? В винде создаются новые сети Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |