Страницы

Поиск по вопросам

суббота, 14 декабря 2019 г.

Автоматическая сборка мусора в программах на С++ [закрыт]

#cpp #cpp11 #сборщик_мусора


        
             
                
                    
                        
                            Closed. This question needs to be more focused. It is
not currently accepting answers.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Want to improve this question? Update the question so
it focuses on one problem only by editing this post.
                        
                        Closed 2 года назад.
                                                                                
           
                
        
Как ?

Какие фичи для упрощения GC есть в редакции С++11 ?

Основы управления памятью в С++ (переопределение new/delete для классов, для которых
мы хотим странного):


http://www.cantrip.org/wave12.html
http://www.cs.wustl.edu/~schmidt/PDF/C++-mem-mgnt4.pdf


Сборка мусора:

A garbage collector for C and C++ - Hans Boehm
    


Ответы

Ответ 1



В C++ нет и не может быть средств сборки мусора. Вместо этого можно использовать умные указатели. Наиболее универсальный из них - shared_ptr. В конструктор умного указателя нужно передать указатель на уже выделенную память, и больше нигде этот указатель использовать нельзя. При копировании объекта shared_ptr, при передаче его как параметр функции увеличивается внутренний счётчик объектов, имеющих в себе один и тот же указатель. Как только последний объект shared_ptr уничтожается (выходит из области видимости), автоматически освобождается память, на которую ссылается внутренний указатель shared_ptr. Вот пример использования. void foo() { //Создаём умный указатель, передав ему обычный указатель на массив из 10 целых чисел std::shared_ptr x(new int(10)); //Вызываем функцию, которая использует этот указатель. На стеке создаётся копия объекта x, которая указывает на ту же память bar(x); //Заканчивается область видимости, удаляется x, освобождается память по данному указателю } void bar(std::shared_ptr y) { //Функция работает со своей копией объекта y[5] = 10; //Область видимости закочилась, объект y удаляется, но так как есть ещё один такой же умный указатель, память не освобождается }

Комментариев нет:

Отправить комментарий