qt, -fno-rtti i okolice

Marcin Dalecki dalecki w dacotec.net
Śro, 8 Gru 1999, 14:02:52 CET


Marcin 'Qrczak' Kowalczyk wrote:
> 
> Wed, 08 Dec 1999 00:26:34 +0100, Martin Dalecki <dalecki w cs.net.pl> pisze:
> 
> > > > > `-fno-rtti'
> > > > >      Disable generation of the information used by C++ runtime type
> > > > >      identification features (`dynamic_cast' and `typeid').  If you
> > > > >      don't use those parts of the language (or exception handling,
> > > > >      which uses `dynamic_cast' internally), you can save some space by
> > > > >      using this flag.
> 
> > > > Excpetions nie mają nic wspólnego z run time type informations.
> > >
> > > To dlaczego zacytowany fragment dokumentacji mówi co innego?
> >
> > Proszę oto tabliczka wartości dla junktora, zwanego alternatywą
> > (do ktorego się chyba odnosisz):
> 
> Naprawdę uważasz, że mieli na myśli, że o ile nie używa się
> dynamic_cast, to wyjątki działają? Ech...
> 
> Zresztą możesz sam sprawdzić. Wyjątki _nie_ działają przy -fno-rtti
> (u mnie prosty przykład daje segmentation fault).

A to jest nowość... Poprzednie wersje kompilatora zachowywały się inaczej.
Tak czy siak błędny jest więc komentarz monieważ powinno więc być
"... (and exceptions ..."

> > Co nie zabronione jest doskonale dozwolone... W przeciwieństwie
> > do np. Javy C++ nie wymaga wyłapywania wszystkich
> > wyjątków. BTW. standard nawet nie definiuje co zwraca new, jeśli
> > się niepowiedzie...
> 
> Nieprawda.
> 
> 9 Storage for the object created by a new-expression  is  obtained  from
>   the  appropriate allocation function (_basic.stc.dynamic.allocation_).
>   When the allocation function is called, the first  argument  shall  be
>   the amount of space requested (which shall be no less than the size of
>   the object being created and which may be greater than the size of the
>   object being created only if the object is an array).
> 
> [...]
> 
>   18.4.1  Storage allocation and deallocation           [lib.new.delete]
> 
>   18.4.1.1  Single-object forms                  [lib.new.delete.single]
> 
>   void* operator new(std::size_t size) throw(bad_alloc);
> 
>   Effects:
>     The allocation function (_basic.stc.dynamic.allocation_) called by a
>     new-expression (_expr.new_) to allocate size bytes of storage  suit-
>     ably aligned to represent any object of that size.
>   Replaceable:
>     a  C++  program  may  define a function with this function signature
>     that displaces the default  version  defined  by  the  C++  Standard
>     library.
>   Required behavior:
>     Return     a    pointer    to    dynamically    allocated    storage
>     (_basic.stc.dynamic_), or else throw a bad_alloc exception.
> 
> Jeśli się nie powiedzie, to new nic nie zwraca, tylko rzuca wyjątek.
> Nie ma innej możliwości.

No nie w tym wypadku to z pewnością nieca nadinterpretujesz standard.
Tak jak mówiłem jeśli operator new rzuca wyjątkiem, to tak czy siak
wywołanie new zwraca jakąś wartość, tylko, że niekoniecznie właściwą.
(Nie musi to być nawet NULL tak jak w malloc.)
A wyjątek można ignorować.

--Marcin



Więcej informacji o liście dyskusyjnej pld-devel-pl