Arhn - архитектура программирования

Как освобождается память в shared_ptr через оператор =?

Я новичок в С++, я изучал концепцию shared_ptr. Я также понял, что несколько объектов shared_ptr могут владеть одним и тем же объектом, и объект уничтожается, а его память освобождается, когда происходит одно из следующих событий:

1. последний оставшийся shared_ptr, владеющий объектом, уничтожается; 2. последнему оставшемуся shared_ptr, владеющему объектом, назначается другой указатель с помощью operator= или reset().

Но когда я попытался выполнить пример программы

     class Rectangle { 
        int length; 
        int breadth; 

        public: 
            Rectangle(int l, int b) 
            { 
              length = l; 
              breadth = b; 
            } 

            int area() 
            { 
                return length * breadth; 
            } 
          }; 

          int main() 
         { 

              shared_ptr<Rectangle> P1(new Rectangle(10, 5)); 
              cout << P1->area() << endl; 

              shared_ptr<Rectangle> P2; 
              P2 = P1;  //how is this possible 

             // This'll print 50 
             cout << P2->area() << endl; 

             // This'll now not give an error, 
             cout << P1->area() << endl; 
             cout << P1.use_count() << endl; 
             return 0; 
            } 

После P2=P1 память, выделенная для P1, должна быть освобождена, верно? Но все же мы можем вывести P1-›area(). Пожалуйста, объясните, как это происходит?


Ответы:


1

2. последнему оставшемуся shared_ptr, владеющему объектом, назначается другой указатель с помощью operator= или reset().

да.

После P2=P1 память, выделенная для P1, должна быть освобождена, верно?

Нет. Это могло бы случиться с P2, если бы оно на что-то указывало. Не P1.

Логика правила (2) заключается в том, что присваивание перезаписывает значение первого операнда, поэтому первый операнд больше не будет указывать на то, к чему он привык. Если это был последний указатель на что-то, то на это уже ничего не будет указывать, и его можно будет удалить.

09.01.2021

2

То, что вы узнали об уничтожении общих указателей, верно. Но здесь вы не уничтожаете P1. Вместо этого вы назначаете P1 P2. Реализация shared_ptr имеет перегруженный оператор присваивания копии, позволяющий эту операцию и сделать ее правильной.

Благодаря этой перегруженной реализации P2 теперь является общим указателем, указывающим на тот же объект, что и P1 — оба указателя обращаются к одному и тому же объекту, поэтому вы печатаете одни и те же области. Оба они существуют в допустимом состоянии, и, как вы видите, количество указателей, управляющих этим объектом Rectangle, равно 2.

Определение перегруженного = согласуется с концепцией shared_ptr — существует несколько указателей, указывающих (принадлежащих) одному и тому же объекту. Если вы хотите увидеть контрастную реализацию, найдите unique_ptr — это интеллектуальный указатель, который предполагает, что только один указатель владеет объектом. Он также имеет перегруженный оператор присваивания, но его использование недействительным P1 (насколько мне известно, он установит его в nullptr, поэтому он все еще будет в допустимом состоянии, просто ни на что не указывающий). P2 будет единственным владельцем Rectangle. Стоит попробовать, для лучшего понимания.

Дополнительную информацию о shared_ptr функциях можно найти здесь.

09.01.2021
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..