Loading...
Jovanna avatar Jovanna 186 Точки

подреждане на памет на масив от обекти и деструктор на обектите

Здравейте,

масивите нали се подреждат последователно в паметта. Ако имаме масив от обекти Array,  с деструктора по-долу освобождаваме само паметта на data, а 4-те байта, заделени последователно за int size, не ги трием. Това няма ли да направи това парче памет, където е бил записан масива от обекти Array, непреизползваемо след излизане от скоуб, защото ще е „накъсано ” от някакви int-ове тук-таме? или ще бъдат изтрити като автоматични променливи, нищо че са полета на променливи/обекти?

class Array {      

private:

       int* data;

       int size; 

~Array() {

             delete[] this->data;

             this->data = nullptr;  

       }

Поздрави!

Тагове:
0
C++ Programming
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки
Best Answer

Здравей,

Автоматичността важи и за полета, не само за локални променливи - полетата живеят, докато живее обекта, на когото принадлежат.

Имай предвид, че int* data само по себе си също е автоматична променлива - общо взето всяка променлива (или поле), която създадеш, ако не е static, е автоматична - просто паметта към която сочи data не е автоматична.

Тоест в този обект ти имаш 2 автоматични променливи, size и data, които ще бъдат освободени при края на живота на Array обекта - само че едната от тези две променливи пази едно число, което е адрес на памет, която е била заделена с new (предполагаемо), и която ако не бъде освободена с delete ще имаш memory leak. Тоест няма такова нещо като динамична променлива - има само динамична памет, която може да бъде сочена от автоматична променлива. Проблемът с memory leaks не е, че указателите не се освобождават, те се освобождават автоматично, ама паметта към която сочат не се освобождава автоматично.

Така че един масив от Array, ще съдържа обекти, които са 2 * 4 = 8 байта големи (всъщност на 64-битова машина най-вероятно ще е 8 байта за указателия плюс 4 за size, плюс още 4 padding, ама нека работим с по-простия вариант). Тоест ако имаш масив от 3 Аrray обекта, това ти дава 3 * 8 = 24 байта, независимо колко елемента има всеки един отделен Array обект, защото паметта за самите елементи на всеки един от тези Array обекти не се намира на същото място, където се намира самия обект (затова имаме указатели, за да укажат къде е това друго място). Като изтриеш масива от Array обекти, за всеки един от трите обекта ще бъде извикан destructor-а, и след това целите 24 байта ще бъдат маркирани за свободни за ползване от системата. Тоест C++ като освобождава памет, финалната му стъпка е да кажет "от тук до там е свободно", без да се интересува какво точно има там - дали ще са int променливи, указатели, или нещо друго. Но преди това вика деструктори, защото може обектите в този диапазон да имат по-сложна логика за освобождаване (както имат нашите Array обекти тук) - затова работата на деструктора е да освободи динамично заделена памет, защото той знае тази памет къде е, и защото C++ като прави "от тук до там е свободно" няма как да знае къде има заделена динамична памет, свързана с тези обекти които освобождава.

Поздрави,

Жоро

1
bekent avatar bekent -4 Точки

Nourishments that contain fake hues, additives and sugars, for example, sugar alcohols and aspartame. Keto-Friendly Beverages Sugar can be found in a wide assortment of refreshments including juice, pop, frosted tea and espresso drinks. While on a ketogenic diet, high-carb drinks must be stayed away from simply like high-carb nourishments. leptitox It's no little issue that sugary refreshments have additionally been connected to different medical problems — from weight to an expanded danger of diabetes (6Trusted Source, 7Trusted Source, 8Trusted Source). Fortunately, there are numerous delectable, sans sugar choices for those on the keto diet. Keto-accommodating drink decisions include: Water: Water is the best decision for hydration and ought to be devoured for the duration of the day. Shimmering water: Sparkling water can make a great soft drink substitution. Unsweetened espresso: Try substantial cream to add flavor to your cup of joe. Unsweetened green tea: Green tea is heavenly and gives numerous medical advantages. 28 day keto challenge

-1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.