Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 06.06.2012
Сообщений: 13
1

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

16.07.2012, 17:07. Просмотров 1640. Ответов 24
Метки нет (Все метки)

Всем привет. Честно говоря я не знаю как ещё более правильно описать проблему в заголовке. В общем проходил раздел, посвящённый <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. Заранее благодарен.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.07.2012, 17:07
Ответы с готовыми решениями:

Confirm - при нажатии на cancel объект всё равно удаляется
Всем добрый вечер, Помогите пожалуйста найти решение по такому вопросу: При нажатии на...

Почему процесс продолжает существовать после закрытия окна?
1. К MS Access 2000 подключил COM Add-in написанный на VBA. При соединении Add-in'а вызывается...

Домен после удаления продолжает существовать, как его удалить?
Я слаб в линуксе, обычно все делаю через админ-панель. Тут заметил, что Яндекс видит один из...

Когда делаю Float left пропадает фон у родительского элемента, точнее он есть но браузеру на него все равно
Вобщем верстал футер он у меня должен быть вот таким пока он у меня вот такой но как только...

24
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); имеется ввиду что-то другое.
0
2551 / 1316 / 177
Регистрация: 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 и &&, а потом сравнить ассемблерный листинг. Может получится.
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
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)
Похоже, все три варианта дают одинаковый асм код
0
2551 / 1316 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
16.07.2012, 20:13 24
ForEveR, а в MSVC есть флаги оптимизации?
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
16.07.2012, 20:50 25
soon, Ага. Это все O0.

Добавлено через 29 минут
http://stackoverflow.com/quest... o#11508812
Или скорее даже как-то так... Тот ответ который я принял кажется более логичным.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.07.2012, 20:50

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Говорит что объект есть, но в коде точно видно что объект удаляется
Добрый день. Вот небольшой пример кода. IF NOT OBJECT_ID('tempdb..#TMP_1') IS NULL DROP TABLE...

Объект браузера продолжает хранить старую версию загруженного файла
Проблема в том, что в пределах одной функции(button1_Click()), после изменения файла, объект...

Не удаляется объект
Доброго времени суток, в коде я удаляю объект, и сразу же добавляю вместо него другой, но проблема...

Почему удаляется объект?
Помогите, пожалуйста, понять почему удаляется объект и как это исправить? Идея следующая: В...

Не удаляется объект из памяти
Здравствуйте! У меня возникла следующая проблема: Мне нужно сделать форму, на которой бы...

Не удаляется объект из списка
у меня есть список: private List&lt;T&gt; List = new List&lt;T&gt;(); где класс Т: public class T :...


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.