2009-02-24 11 views
5

Próbuję uzyskać trochę pamięci w programie C++ i chcę wiedzieć, czy mogę używać bloków jako zakresu zmiennych (jak w Perlu). Powiedzmy mam ogromny obiekt, który wykonuje pewne obliczenia i daje wynik, czy to ma sens robić:Czy mogę używać bloków do zarządzania zakresem zmiennych w C++?

InputType input; 
ResultType result; 

{ 
    // Block of code 
    MyHugeObject mho; 
    result = mho.superHeavyProcessing(); 
} 

/* 
    My other code ... 
*/ 

mogę oczekiwać przedmiotem zostać zniszczone przy wyjściu z bloku?

Odpowiedz

25

Tak, możesz.

Destruktor zostanie wywołany, gdy tylko zmienna wypada poza zakres i powinna zwolnić pamięć przydzieloną stertom.

+0

Ściśle mówiąc, wywołanie destruktora nie jest tym samym, co zwolnienie pamięci używanej do przechowywania obiektów. – Constantin

+0

Myślę, że można bezpiecznie założyć, że * wielkie * słowo w pytaniu oznacza, że ​​obiekt przydzielił większą porcję pamięci na stercie i chce, aby została zwolniona (np. Wektor). –

+0

Przykro mi, ale wydaje mi się, że MyHugeObject jest alokowany na stosie, a nie na kupce, chyba że zrobiono jawne wycinanie malloc. Proszę popraw mnie jeżeli się mylę. – 0fnt

18

Tak, absolutnie, a oprócz oszczędzania pamięci, wywołanie destruktora na wyjściu z zakresu jest często używane tam, gdzie chcemy, aby destruktor rzeczywiście coś robił po wywołaniu destruktora (patrz RAII). Na przykład, aby utworzyć blokadę opartą na zakresie i zwolnić go łatwo w sposób wyjątkowy w bezpieczny sposób lub w sposób deterministyczny uzyskać dostęp do współdzielonego lub cennego zasobu (takiego jak uchwyt pliku/połączenie z bazą danych).

-Rick

+0

+1 za odniesienie do blokowania na podstawie zakresu, bardzo ładna koncepcja. – mghie

3

Wystarczy pamiętać, że każda pamięć przeznaczyć na stercie używając nowego/malloc, która uwalnia się w destructor prawdopodobnie nie zostanie zwolniony z powrotem do systemu operacyjnego. Twój proces może na nim czekać, a system operacyjny nie odzyska go, dopóki proces się nie zakończy.

+0

Chociaż w tym przypadku pamięć jest na stosie, który system operacyjny prawdopodobnie już zatwierdził dla twojego programu. (Chociaż w Windowsie to jest zaskakujące, nie zawsze tak jest!). –

+0

Prawda - moje założenie było takie, że każdy obiekt będący ogromnym obiektem musi dynamicznie alokować pamięć wewnętrznie, nawet jeśli jest na samym stosie. – Jackson

+0

To nie jest dokładne. Mimo że duża część pamięci nadal będzie przypisana do aplikacji, jeśli nie będzie używana, będzie ona stronicowana z pamięci fizycznej i nie będzie miała żadnego wpływu na wydajność. Kilka systemów operacyjnych (Windows) nieco słabo radzi sobie z nieużywaną pamięcią stronicowaną, ale zawsze można to obejść, używając pliku odwzorowanego w pamięci i usuwając go, gdy zostanie to zrobione, ponieważ w efekcie tworzy oddzielny plik strony dla tej przestrzeni adresowej. – SingleNegationElimination

2

Tak. Zostanie zniszczony na zamkniętym nawiasie klamrowym. Ale uważaj na przydzielanie bardzo dużych obiektów na stosie. Może to spowodować przepełnienie stosu. Jeśli obiekt również przydziela dużą ilość pamięci, upewnij się, że jest ona stertowana z nowym, malloc lub podobnym.

+0

Obiekty faktycznie wskazują pamięć przydzieloną stertom, ale chcę ją zwolnić tak szybko, jak to możliwe. – tunnuz

Powiązane problemy