Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

BobyTopalova avatar BobyTopalova 26 Точки

Въпрос за задача 3 ArrayOfPointers

Моето, решение - https://pastebin.com/w6mdUfB8

Решението на автора https://pastebin.com/Sdw6SxY8

Искам малко, обяснение за авторовото решение. Ясно е че то ползва правилото на нулата, но не ми е ясно, как така няма мемори лийк, след като няма деструктор.

Искам да питам и в моето решение ползвам итератор, за да изтрия вектор от пойтери, как по друг начин може да се направи това?

Тагове:
0
C++ Advanced
j.petrov_90 avatar j.petrov_90 373 Точки
Best Answer

Привет,

Правилно си забелязала, че авторското решение използва правилото на нулата (т.е. позоваваме се на default-ния destructor).
Права си, че щеше да има memory leak, ако в авторското решение се работеше със сурови "или raw" pointer-и.
Решението обаче използва std::shared_ptr<> (smart pointer-и)
За тях учихме във лекцията за динамимно заделяне на памет.
Това са обекти, които се грижат за автоматичното зачистване на паметта.

В задачата паметта се заделяще диначимно някъде в main-а.
Авторското решение "прехвълвя отговорността" за зачистване на заделената памет като я предава на std::stared_ptr<>
Така като се викне default-ния destructor на ArrayOfPointers class-а -> ще се викне destructor-а на shared_ptr-а и от там ще се зачисти паметта.


Относно въпроса за итератора ти:
"Искам да питам и в моето решение ползвам итератор, за да изтрия вектор от пойтери, как по друг начин може да се направи това?"
По колкото различни начина можеш да достъпиш елементите на един контейнер - по толкова начина можеш да изтриеш паметта за всеки негов елемент(разбира се, ако тя изобщо е динамично заделена).

В случая на вектор аз се сещам 3 начини да се итерира по контейнера:
1) чрез итератор - for ( it = companies.begin(); it != companies.end(); ++it ) { delete *it; }

2) чрез обикновен цикъл(for, while, do/while) - for ( int i = 0; i < companies.size(); ++i ) { delete companies[i]; }

3) чрез range based for-loop - for ( Company * element : companies ) { delete element; }

По-здрави! :)

0
BobyTopalova avatar BobyTopalova 26 Точки

Явно не чувам, като ни обяснявате на лекциите. Нищо, поне сега ще го разбрах. Извинявайте за глупавия въпрос!

Иначе за трите начина, с които да изтрия масив от пойнтери, които вие сте ми написал, за втория никога нямаша да се сетя.

(for, while, do/while) - for ( int i = 0; i < companies.size(); ++i ) { delete companies[i]; } , защото никъде не се казва че трием пойнтери, така де да не забравяме [] всъщност пак са вид пойнтер.

Не че за третия се сетих, но поне се разбира, че са пойнтери (по-близко е до мозъка).

Много, Благодаря !  По-здрави! :)

 

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