A reinterpret_cast nem definiált viselkedés?

Pontszám: 5/5 ( 72 szavazat )

2 válasz. Bár maga a reinterpret_cast is meghatározatlan viselkedés lehet, a paraméterekhez való hozzáférés kísérlete az átküldés után meghatározatlan viselkedés.

Mi az a reinterpret_cast?

A reinterpret_cast a C++-ban használt casting operátor típusa . Arra szolgál, hogy egy mutatót konvertáljon egy másik, bármilyen típusú mutatóból, függetlenül attól, hogy az osztály kapcsolódik-e egymáshoz vagy sem. Nem ellenőrzi, hogy a mutató típusa és a mutató által mutatott adatok megegyeznek-e vagy sem.

A const_cast nem definiált viselkedése?

Annak ellenére, hogy a const_cast eltávolíthatja az állandóságot vagy az ingadozást bármely mutatóból vagy hivatkozásból, az eredményül kapott mutató vagy hivatkozás használata a const-nak nyilvánított objektumra való íráshoz vagy a volatilisnak nyilvánított objektum eléréséhez meghatározatlan viselkedést idéz elő. Tehát igen , a konstans változók módosítása nem definiált viselkedés.

A reinterpret_cast sikertelen lehet?

Az a tény, hogy a dynamic_cast és a static_cast megváltoztathatja a címet, ezért nem ajánlott a reinterpret_cast . Olyan értéket eredményezhet, amely nem azt csinálja, amit szeretne. A Cast újraértelmezése mindig egy mutatót ad vissza.

Mi a különbség a static_cast és a reinterpret_cast között?

A static_cast csak olyan konverziókat tesz lehetővé, mint az int lebegtetésre vagy az alaposztálymutató a származtatott osztálymutatóra. A reinterpret_cast bármit megenged, ez általában veszélyes dolog, és általában a reinterpret_cast ritkán használatos, tipikusan a mutatók egész számokká történő konvertálására vagy az alacsony szintű memóriakezelés lehetővé tételére.

C++ Weekly - 185. rész - Hagyd abba a reinterpret_cast használatát!

41 kapcsolódó kérdés található

Mi a static_cast vs Dynamic_cast?

static_cast – Ez a normál/hétköznapi típusú konverzióhoz használatos . ... dynamic_cast −Ezt az öntést a polimorfizmus kezelésére használják. Csak akkor kell használnia, ha származtatott osztályba küld át. Ez kizárólag az öröklődésben használható, amikor alaposztályról származtatott osztályba küld.

Meghibásodhat a static_cast?

A dynamic_cast egy kétértelmű mutatóra meghiúsul, míg a static_cast úgy tér vissza, mintha semmi baja nem lenne ; ez veszélyes lehet. Bár a dynamic_cast konverziók biztonságosabbak, a dynamic_cast csak mutatókon vagy hivatkozásokon működik, és a futásidejű típusellenőrzés többletköltséget jelent.

Lehet Reinterpret_cast dobni?

Nem, sem a reinterpret_cast <T>, sem a C-stílusú cast megfelelője nem végez semmilyen ellenőrzést, így önmagukban nem okozhatnak kivételt. Nyilvánvaló, hogy mivel mindkét konstrukció körülbelül annyira nem biztonságos, amennyire csak lehet, az eredménymutató ap hivatkozásának megszüntetése definiálatlan viselkedést okozhat.

Mi az a C-stílusú öntvény?

Vegye figyelembe, hogy a C-stílusú (T) kifejezés leadása azt jelenti , hogy a következők közül az elsőt kell végrehajtani , ami lehetséges: a const_cast , a static_cast , a static_cast egy const_cast , egy reinterpret_cast vagy egy reinterpret_cast, amelyet egy const_cast követ. Ez a szabály csak akkor tiltja a (T) kifejezést, ha nem biztonságos leadásra használják.

Mi az a T méret?

A size_t adattípus előjel nélküli integráltípus. Bármely objektum méretét ábrázolja bájtokban, és a sizeof operátor adja vissza . Tömb indexelésére és számlálására használják. Soha nem lehet negatív. Az strcspn, strlen függvények visszatérési típusa a size_t.

Miért rossz a const_cast?

A const teljes célja, hogy megakadályozza, hogy módosítson valamit , ezért a kód hibát generál. A const_cast hozzáadásával lényegében azt üzeni a fordítónak, hogy fogjon be, hogy tudja, mit csinál. Ezért nem jó ötlet. Ha nem akarod, hogy const legyen, ne deklaráld const.

A const_cast biztonságos?

A const_cast csak akkor biztonságos, ha olyan változót küld, amely eredetileg nem const volt . Például, ha van egy függvénye, amely egy const char * paramétert vesz fel, és egy módosítható char * karaktert ad át, biztonságosan const_cast visszaadja ezt a paramétert egy char *-ba, és módosíthatja azt.

Hogyan távolíthatom el a const minősítőt?

Ezt a folyamatot, amelyben a const_castot használjuk egy objektum const minősítésének eltávolítására, az állandóság elküldésének nevezzük. Következésképpen a fordító engedélyezi az f(c) függvényhívást. A fordító nem engedélyezi a *b = 20 hozzárendelést, mert b egy const int típusú objektumra mutat.

A reinterpret_cast eltávolíthatja a const?

A reinterpret_cast operátor nem használható a const ; használja erre a célra a const_cast-ot. A reinterpret_cast operátort nem szabad arra használni, hogy a mutatókat olyan különböző osztályokba konvertálja, amelyek ugyanabban az osztályhierarchiában vannak; használjon statikus vagy dinamikus öntvényt erre a célra.

Mi történik, ha a mutatót kétszer törlik?

Ha törlést alkalmaz az egyik mutatóra, akkor az objektum memóriája visszakerül az ingyenes tárolóba. Ha ezt követően töröljük a második mutatót , akkor az ingyenes tároló megsérülhet .

Mi az a Type punning C++?

A típuskódolás annak a lehetősége, hogy egy programozási nyelv szándékosan felforgatja a típusrendszert, hogy egy típust más típusként kezeljen . A C++-ban a betűírás egyik tipikus módja az, hogy egy szakszervezet tagját más típussal olvassuk be, mint amilyennel írták.

Használjak C stílusú castokat C++-ban?

A C++ fordító nem olyan kedves. A C-vel ellentétben a C++ fordító lehetővé teszi az implicit konvertálást void * típusba, de a FROM-ból void * típusú konvertáláshoz explicit leadásra van szükség. ... Ez működni fog, de ez az öntési stílus nem ajánlott C++ nyelven. Vannak egyértelműbb módszerek, amelyek lehetővé teszik szereposztásunk szándékának leírását.

Hányféle átalakítás létezik?

Kétféle konverzió létezik: implicit és explicit. Az implicit típuskonverzió kifejezése a kényszer. Az explicit típuskonverziót valamilyen meghatározott módon castingnak nevezik. Az explicit típuskonverzió külön definiált konverziós rutinokkal is elérhető, például túlterhelt objektumkonstruktorral.

Mi az implicit konverzió?

Az implicit típuskonverziót „ automatikus típuskonverziónak ” is nevezik. Ezt a fordító önállóan végzi el, a felhasználótól származó külső trigger nélkül. Általában akkor fordul elő, ha egy kifejezésben egynél több adattípus van jelen.

A static_cast adhat kivételt?

A static_cast nem tud kivételt dobni , mivel a static_cast nem futásidejű cast, ha néhányat nem lehet leadni, a kód nem fordítható le. De ha rossz a fordítás és az öntvény - az eredmény nem definiálható.

Mire jó a Const_cast a C++ nyelven?

A const_cast az egyik típusú casting operátor. Bármely objektum állandó értékének megváltoztatására szolgál, vagy azt is mondhatjuk, hogy bármely objektum állandó jellegének eltávolítására szolgál. A const_cast olyan programokban használható, amelyekben bármilyen állandó értékű objektum van, amelyet időnként módosítani kell.

Újraértelmezi a leadott híváskonstruktort?

A const_cast, dynamic_cast vagy reinterpret_cast soha nem hoz létre új osztálytípusú objektumot, és így soha nem hív meg konstruktort .

A static_cast lefoglal memóriát?

A static_cast-ról tudomásom szerint csak a mutató típusát változtatja és nem foglal le memóriát , de itt nem csak a le nem osztott memóriához tudtunk hozzáférni, hanem az értéket is eleinte 0-ra állítottam, ezért csináltam egy kis saját kísérletet. A kimenet az volt, amit korábban kaptam.

A static_cast fordítási ideje?

Bár a static_cast konverziókat fordításkor ellenőrzik a nyilvánvaló összeférhetetlenségek elkerülése érdekében, nem történik futásidejű típusellenőrzés, amely megakadályozná az inkompatibilis adattípusok, például mutatók közötti átküldést.

Mit csinál valójában a static_cast?

static_cast. A static_cast használható a mutatók közötti kapcsolódó osztályokká konvertálására (az öröklési hierarchiában felfelé vagy lefelé). Implicit konverziókat is végezhet. ... a static_cast valóban végrehajtaná ezt az implicit leadást, ha mégis használod.