Neinicializované paměti v C ++ Builder / Delphi

hlasů
2

Jsou neinicializované proměnné v Delphi zaručeno, že žádnou konkrétní hodnotu

  • ve frontě?
  • na haldě?

Vzhledem k tomu, C ++ Builder obvykle následuje Delphi designu, jsou neinicializované proměnné v C ++ Builder zaručeně žádnou konkrétní hodnotu

  • ve frontě?
  • na haldě, pro proměnné členů třídy odvozené od TObject?
  • na haldě, pro proměnné členů Pocos ?

Já jsem zdědil nějaké C ++ Builder kód, který do značné míry závisí na místech k proměnné členů je nula inicializace a snažím se přijít na to, zda jazykové záruky či nikoli.

Nezaručuje Windows, že paměť je nula inicializace, když je to poprvé uveden na zásobníku nebo haldy program je? ( Edit: Já si uvědomit, že program přepíše paměti, jak to provádí, a proto nemůže nadále záviset na tom, Jen se snažím přijít na to chování, které jsem pozorovaný).

Položena 06/06/2009 v 15:05
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
7

Vzhledem k odpovědi Caskey se týká pouze C ++ svou odpověď pro Delphi:

V Delphi odkazují na tuto odpověď ze strany Giacomo Degli Esposti

  • Pole objektů jsou vždy inicializována na hodnotu 0, 0.0 ‚‘, False, nil nebo co platí.
  • Globální proměnné jsou vždy inicializuje. (Na 0)
  • Lokální proměnné jsou unitialized takže budete muset přiřadit hodnotu, než budete moci použít.

ms-help: //borland.bds4/bds4ref/html/Variables.htm

Všechny úvěry Giacomo Degli Esposti

Edit : „ nezaručuje Windows, že paměť je nula inicializace, když je to poprvé uveden na zásobníku nebo haldy program je?

Windows zaručuje, že paměť je nula inicializace, když je to poprvé uveden v novém procesu (jinak byste mít velký bezpečnostní problém s programy budou moci přečíst další procesy vyřazené paměti bez ohledu na oprávnění). Nicméně pomocí C ++ Tato záruka nepomůže moc jako c-runtime může přepsat paměť svého uvážení před kód dostane šanci, aby ji používat.

Edit2 : Pro C ++ Builder proměnných jsou zřejmě inicializovat pro „ tříd VCL-stylu “, viz (ať už to znamená, že všechny, které dědí z TObject?) Http://docs.embarcadero.com/products/rad_studio/cbuilder6/EN/CB6_DevelopersGuide_EN. pdf

Cituji:

„Vzhledem k tomu, datové členy mohou být použity ve virtuální funkce, je důležité pochopit, kdy a jak jsou inicializovat. V Object Pascal, všechny neinicializované dat je nula-inicializovat. To platí například pro základní třídy, jejichž konstruktéři nejsou volána . zdědil ve standardním C ++, neexistuje žádná záruka na hodnotu neinicializované datových členů. následující typy členů třídy dat, musí být iniciovány v seznamu inicializační konstruktoru třídy: • Reference • datové členy bez výchozí konstruktor

Nicméně hodnota těchto datových členů, nebo ty, inicializována v těle konstruktoru je definováno, pokud jsou základní třídy konstruktory volal. V jazyce C ++ Builder, paměť pro třídy VCL stylu je nula inicializaci.

Technicky to je vzpomínka na VCL nebo třídy CLX, který je nula, to znamená, že bity jsou nulové, jsou hodnoty ve skutečnosti definován. Například, odkaz je nula.

Virtuální funkce, která závisí na hodnotě proměnné členů inicializována v těle konstruktoru, nebo v seznamu inicializace může chovat, jako kdyby byly proměnné inicializovány na nulu. Důvodem je, že základní třídy konstruktoru se nazývá před seznam inicializace je zpracován nebo zadání konstruktor tělo.

#include <sysutils.hpp>
class Base : public TObject {
public:
    __fastcall Base() { init(); }
        virtual void __fastcall init() { }
    };
class Derived : public Base {
    public:
        Derived(int nz) : not_zero(nz) { }
        virtual void __fastcall init()
        {
        if (not_zero == 0)
        throw Exception("not_zero is zero!");
        }
    private:
        int not_zero;
};
int main(void)
{
    Derived *d42 = new Derived(42);
    return 0;
}

Tento příklad výjimku v konstruktoru báze. Vzhledem k tomu, základna je zkonstruována tak před Odvozená, not_zero, dosud nebyla inicializována s hodnotou 42 předat konstruktoru. Uvědomte si, že nemůžete datové členy vaší třídy VCL stylu inicializovat před jeho základní třídy konstruktérů se nazývají „.

Odpovězeno 06/06/2009 v 15:20
zdroj uživatelem

hlasů
2

Stručná odpověď: v jazyce C ++ musíte inicializovat vše

-Li C ++ Builder je něco jako C ++, pak není tam žádné záruky, pokud jde o obsah paměti, pokud je výslovně jej inicializovat.

Zatímco windows může prázdné stránky předtím, než je k dispozici hromadu nebo haldy program, není-li žádáte svou vlastní paměť od operačního systému, budete pravděpodobně používat konstruktérů nebo knihovnu pro přidělování paměti. Daleko častěji jste získali určité stránky či paměťovou oblast, kterou již používá sami. V tomto případě je to skoro zaručeno, že bude špinavá. Dvojnásob pro stack stránek, které jsou téměř nikdy nové stránky.

memset () by bylo, jak byste je otřít paměti v jazyce C, ale v jazyce C ++ je třeba zadat výchozí hodnoty pro každé pole, nebo explicitně inicializovat v konstruktoru.

Odpovězeno 06/06/2009 v 15:13
zdroj uživatelem

hlasů
1

V Delphi tady TObject konstruktor nulové inicializuje haldy vyčleněná (vždy na haldě, protože TObjects nelze stohu instance v Delphi) paměť předmětem, a tím odstranění všech proměnné členů.

Odpovězeno 06/06/2009 v 15:30
zdroj uživatelem

hlasů
1

V jazyce C ++ paměti je zaručeno, že je spuštěn v následujících případech:

  • Pro staticky přidělené proměnné
  • Pro objekt s konstruktor, který inicializuje svých členů

V prvním z těchto případů, POD datové typy, jako ints, ukazatele apod bude nula inicializace.

To jsou jediné zaručuje, že C ++ Standard poskytuje. Windows neposkytuje žádné záruky vůbec v této oblasti.

Odpovězeno 06/06/2009 v 15:20
zdroj uživatelem

hlasů
0

Na Delphi, pokud je mi známo: * VCL třídy auto inicializovat jeho pole. * Globals příliš

Lokální proměnné není inicializována. Jejich počáteční obsah je zcela definován. Takže, Assigned (variabilní) typu TObject vrátí false všechny časy v případě, že proměnná je lokální.

Odpovězeno 12/06/2009 v 07:05
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more