информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsАтака на Internet
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++ Bug] Bug report 25.07.01 01:12  Число просмотров: 955
Автор: kabanchik Статус: Незарегистрированный пользователь
<"чистая" ссылка>
за синтаксические ошибки сорри, я ночью писал, уже носом в клаву клевал.

>
> Попробовал вышло вот что :
>
>
> > =============================
> >
> > 
> > #define TRACE(x) printf(x)
> > 
> > class Parrent
> > {
> > public:
> >	 Parrent()
> >	 {m_pParrent = new char[10];}	 // for fun
> >	 virtual ~Parrent()
> >	 {if (m_pParrent != NULL) delete [] m_pParrent;
> > m_pParrent = NULL;}
> > public:
> >	 virtual void PrintMsg()
> >	 {
> >	TRACE("This function called from class
> > Parrent.\n");
> >	 }
> > 
> > protected:
> >	 char*	  m_pParrent;
> > };
> > 
> > class Child: public Parrent
> > {
> > public:
> >	 Child()
> >	 {m_pChild = new char[30];}	  // just for fun,
> dummy
> 
> ^^^^^^^^^^^^^^^^^^^
> это скорее всего очепятка - добавляем char* m_pChild
^^^^^^^^^^ это совершенно верно заметил
> 
> > buffer
> >	 virtual ~Child()
> >	 {if (m_pChild != NULL) delete [] m_pChild;
> m_pChild =
> > NULL;}
> > 
> > public:
> >	 virtual void PrintMsg()
> >	 {
> >	TRACE("This function called from class Child.\n");
> >	 }
> > 
> >	 void Magic()
> >	 {
> >	this->~Child();
> ^^^^^^^^^^^^^^^^^^^^^^^^^
> Вот это КРУТО :)) надо запомнить :)
> 
> >	new (this) Parrent;
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> А вот на эту конструкцию мой компилер сказал
> test3.cpp: In method `void Child::Magic()':
> <internal>:39: too many arguments to function `void *
> operator new(unsigned int)'
> test3.cpp:39: at this point in file
> для справки 
> $g++ -v
> gcc version 2.95.3 20010315 (release) 
> 
> Я поправил на new(*this) Parrent
> 
> Это была фича или очепятка ?
^^^^^^^^^^^^^^^^^^
Все ОК! тока надо было #include <new.h> - забыл предупредить, хотя странно - результат у тебя получился верный :-))))
тут работает оператор:
void operator new (size_t size, void *ptr)
{
   return ptr;
}
> 
> 
> >	TRACE("Leave Magic.\n");
> >	 }
> > }
> > 
> > int main()
> > {
> >	 Child child;
> >	 Child* pChild = &child;
> >	 Child& rChild = child;
> > 
> >	 child.PrintMsg();
> >	 pChild->PrintMsg();
> >	 rChild.PrintMsg();
> >	 TRACE("\n");
> >	 child.Magic();
> >	 TRACE("\n");
> >	 child.PrintMsg();
> >	 pChild->PrintMsg();
> >	 rChild.PrintMsg();
> > 
> >	 return 0;
> > }
> > 

---
> >
>
> Результат:
>
> This function called from class Child.
> This function called from class Child.
> This function called from class Child.	
> 
> Leave Magic.  
> 
> This function called from class Child. 
> This function called from class  Parrent. 
> This function called from class  Parrent.
> 

---
>
> Это видимо какие то фокусы с перегрузкой таблицы
> виртуальных функций ?

УГУ !!! именно такой вот эффект. в сущности получается, что *pChild != child;
я над этим примером сотни экспериментов проводил. впечатление, что у child - таблица статическая, а у всех остальных, даже если так -

child.Magic()
pChild = &child;
rChild = child;

динамическая. монопенисно !!!!! результат не изменим.
самое обидное, что GNU вообще не отреагировало на это, даже культурно послали на news forum, впечатление, что им по барабану. а M$ откликнулся - они просто написали каков результат, а причину так и не объяснили - отмахнулись ;-)
<programming> Поиск 






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach