Welcome Guest ( Log In | Register )

Help | Search | Members | Calendar

 
Почему это работает?, cpp question
« Next Oldest | Next Newest » Track this topic | Email this topic | Print this topic
Master of Puppets
Posted: Nov 7 2008, 18:31

Eye of the Vision

Group: Moderator
Member No.: 2067

Joined: August 29, 2006

CODE

#include <boost/shared_ptr.hpp>
#include <iostream>

template <class T> void repl();

class A{
public:
virtual int foo() = 0;
int k;
};

class C : public A{
public:
virtual int foo(){
 k = 0;
 return k;
}
};

class B : public A{
public:
~B(){
 deleted = true;
}
virtual int foo(){
 q = 1;
 deleted = false;
 repl<C>();
 if(deleted) std::cout << "Destructor has been called\n";
 q = 2;
 return q;
}
int q;
bool deleted;
};

boost::shared_ptr<A> p;

int main()
{
repl<B>();
std::cout << p->foo() << std::endl;
std::cout << p->foo() << std::endl;
return 0;
}

template <class T>
void repl(){
p.reset(new T);
std::cout << p.get() << std::endl;
}

Аутпут получается такой:
CODE

Destructor has been called
2
0

Вопрос: как такое может быть? Ведь содержимое смарт-пойнтера фактически меняется "на лету", причем деструктор класса B вызывается и пойнтер показывает на объект другого класса (в котором нет поля q). Все так и должно быть или это чистая случайность, что этот код работает?
P.S.:
Используемый компилятор - gcc version 4.1.1 20070105 (Red Hat 4.1.1-52)

--------------------
Master of Puppets, I'm pulling your strings, twisting your mind and smashing your dreams!
⠠⠵
 
       Top
Dream_InspectoR
Posted: Nov 7 2008, 19:57

Eye of the Vision

Group: Moderator
Member No.: 614

Joined: February 10, 2004

Воистину один дурак может сказать такое....

Ты написал абсолютную #*йню, и она может работать как ей влезет вообще. Ты удаляешь обьект B в функции B::foo, a потом выводишь на экран содержимое q которое неопределено, и следовательно может печатать все что ему влезет. Потом ты присвоил опять таки несуществующей перменной значение - отсюда следует что далее в твоей программе вообще все что угодно может проиходить.

--------------------
Kill'em!!! Kill'em ALL!!!
 
        Top
Master of Puppets
Posted: Nov 7 2008, 21:04

Eye of the Vision

Group: Moderator
Member No.: 2067

Joined: August 29, 2006

QUOTE (In the immortal words of Dream_InspectoR, since Nov 7 2008, 19:57)
Воистину один дурак может сказать такое....

Ты написал абсолютную #*йню, и она может работать как ей влезет вообще. Ты удаляешь обьект B в функции B::foo, a потом выводишь на экран содержимое q которое неопределено, и следовательно может печатать все что ему влезет. Потом ты присвоил опять таки несуществующей перменной значение - отсюда следует что далее в твоей программе вообще все что угодно может проиходить.

Ну так я и говорю, что эта абсолютная #*йня. Я вообще думал, она с сегфолтом должна была вывалиться. Но почему-то не валится smile.gif Почему - не совсем понятно, наверное, место, которое раньше занимал удаленный объект не успевает похерачиться.

--------------------
Master of Puppets, I'm pulling your strings, twisting your mind and smashing your dreams!
⠠⠵
 
       Top
Dream_InspectoR
Posted: Nov 7 2008, 22:27

Eye of the Vision

Group: Moderator
Member No.: 614

Joined: February 10, 2004

Да не успевает. но вполне может и успеть, зависит от того как написан boost::shared_ptr.

--------------------
Kill'em!!! Kill'em ALL!!!
 
        Top
3 replies since Nov 7 2008, 18:31 Track this topic | Email this topic | Print this topic

<< Back to Programming languages

 




Arminco Global Telecommunications