Форум программистов, компьютерный форум CyberForum.ru

Удаляется объект когда не требуется и всё равно продолжает существовать - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
mamucho666
1 / 1 / 0
Регистрация: 06.06.2012
Сообщений: 13
16.07.2012, 17:07     Удаляется объект когда не требуется и всё равно продолжает существовать #1
Всем привет. Честно говоря я не знаю как ещё более правильно описать проблему в заголовке. В общем проходил раздел, посвящённый <functional>, и, собственно, там всё понятно, но заметил одну странность, потом перепроверил в специально написанном для проверки более простом коде и она подтвердилась.
Код ниже выводит на экран вот эти надписи:

ok1
ok2
delete ok1
100

delete ok2

Вопросы мои по поводу выделенных жирным.

1. Зачем удаляется объект класса ок1 до завершения функции в которой он создан?
2. Если он удалился, то откуда тогда взялся доступ к члену этого объекта?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct ok1
{
    ok1(int i):val(i){cout << "ok1" << endl;}
    int val;
    ~ok1(){cout << "delete ok1" << endl;}
};
struct ok2
{
    ok2 (ok1 & refobj):obj(refobj){cout << "ok2" << endl;}
    ok1 & obj;
    ~ok2(){cout << "delete ok2" << endl;}
};
int main()
{
    ok2 a(ok1(100));
    cout << a.obj.val << endl;
    system("pause");
    return 0;
}
P.S. Заранее благодарен.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2012, 17:07     Удаляется объект когда не требуется и всё равно продолжает существовать
Посмотрите здесь:

окно всё равно закрывается.... C++
сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного - зачем всё это? в смысле, можно же без этого? так зачем жизнь усложнять? C++
this это адресс объекта, а *this это сам объект. я всё правельно понял? C++
C++ Конструктор, принимающий в качестве аргумента ссылку на объект, всё портит
Созданный объект Array<char> удаляется, как только метод convert завершается C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mamucho666
1 / 1 / 0
Регистрация: 06.06.2012
Сообщений: 13
16.07.2012, 19:13  [ТС]     Удаляется объект когда не требуется и всё равно продолжает существовать #21
В общем я наверно пока закрою на это глаза и продолжу изучать дальше, всем огромное спасибо, может где-то это описано в книге. Липпман - C++ Primer, если кому интересно.

P.S. Кстати вот такая запись почему-то работает
int a(100);
ok::ok(a);

Наверно при использовании
int a(100);
ok(a); имеется ввиду что-то другое.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
16.07.2012, 19:21     Удаляется объект когда не требуется и всё равно продолжает существовать #22
ForEveR, эх, был бы онлайн компилер MSVC...
Раз по стандарту может быть только const & или &&, следовательно надо проверять на MSVC 08(если, конечно, он не поддерживает rvalue-ссылки).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <string>
 
using namespace std;
 
void value(string& value)
{
    value = "42";
}
 
int main()
{
    value(string());
}
Если прокатит, то MSVC идет вразрез со стандартом, причем дело не ограничивается кастованием к const. Ну и почему не получается с примитивными типами - брр
Еще была идея скомпилировать с const и &&, а потом сравнить ассемблерный листинг. Может получится.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.07.2012, 20:07     Удаляется объект когда не требуется и всё равно продолжает существовать #23
Код который был.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
00A53500  push        0A5CBB8h  
00A53505  lea         ecx,[ebp-0F0h]  
00A5350B  call        std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_string<char,std::char_traits<char>,std::allocator<char> > (0A513A7h)  
00A53510  mov         dword ptr [ebp-0F8h],eax  
00A53516  mov         eax,dword ptr [ebp-0F8h]  
00A5351C  mov         dword ptr [ebp-0FCh],eax  
00A53522  mov         dword ptr [ebp-4],0  
00A53529  mov         ecx,dword ptr [ebp-0FCh]  
00A5352F  push        ecx  
00A53530  call        value (0A5143Dh)  
00A53535  add         esp,4  
00A53538  mov         dword ptr [ebp-4],0FFFFFFFFh  
00A5353F  lea         ecx,[ebp-0F0h]  
00A53545  call        std::basic_string<char,std::char_traits<char>,std::allocator<char> >::~basic_string<char,std::char_traits<char>,std::allocator<char> > (0A512BCh)
rvalue.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
00CD3500  push        0CDCBB8h  
00CD3505  lea         ecx,[ebp-0F0h]  
00CD350B  call        std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_string<char,std::char_traits<char>,std::allocator<char> > (0CD13A7h)  
00CD3510  mov         dword ptr [ebp-0F8h],eax  
00CD3516  mov         eax,dword ptr [ebp-0F8h]  
00CD351C  mov         dword ptr [ebp-0FCh],eax  
00CD3522  mov         dword ptr [ebp-4],0  
00CD3529  mov         ecx,dword ptr [ebp-0FCh]  
00CD352F  push        ecx  
00CD3530  call        value (0CD1442h)  
00CD3535  add         esp,4  
00CD3538  mov         dword ptr [ebp-4],0FFFFFFFFh  
00CD353F  lea         ecx,[ebp-0F0h]  
00CD3545  call        std::basic_string<char,std::char_traits<char>,std::allocator<char> >::~basic_string<char,std::char_traits<char>,std::allocator<char> > (0CD12BCh)
const.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
00A93500  push        0A9CBB8h  
00A93505  lea         ecx,[ebp-0F0h]  
00A9350B  call        std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_string<char,std::char_traits<char>,std::allocator<char> > (0A913A7h)  
00A93510  mov         dword ptr [ebp-0F8h],eax  
00A93516  mov         eax,dword ptr [ebp-0F8h]  
00A9351C  mov         dword ptr [ebp-0FCh],eax  
00A93522  mov         dword ptr [ebp-4],0  
00A93529  mov         ecx,dword ptr [ebp-0FCh]  
00A9352F  push        ecx  
00A93530  call        value (0A91447h)  
00A93535  add         esp,4  
00A93538  mov         dword ptr [ebp-4],0FFFFFFFFh  
00A9353F  lea         ecx,[ebp-0F0h]  
00A93545  call        std::basic_string<char,std::char_traits<char>,std::allocator<char> >::~basic_string<char,std::char_traits<char>,std::allocator<char> > (0A912BCh)
Похоже, все три варианта дают одинаковый асм код
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
16.07.2012, 20:13     Удаляется объект когда не требуется и всё равно продолжает существовать #24
ForEveR, а в MSVC есть флаги оптимизации?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2012, 20:50     Удаляется объект когда не требуется и всё равно продолжает существовать
Еще ссылки по теме:

C++ Почему удаляется объект?
C++ Объект удаляется до возвращения его из функции
C++ Зачем нужно освобождать память динамических объектов в деструкторе, если всё равно это сделает менеджер памяти

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.07.2012, 20:50     Удаляется объект когда не требуется и всё равно продолжает существовать #25
soon, Ага. Это все O0.

Добавлено через 29 минут
http://stackoverflow.com/questions/1...tudio#11508812
Или скорее даже как-то так... Тот ответ который я принял кажется более логичным.
Yandex
Объявления
16.07.2012, 20:50     Удаляется объект когда не требуется и всё равно продолжает существовать
Ответ Создать тему
Опции темы

Текущее время: 02:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru