c ++ - подсчет ссылок сборка мусора - PullRequest
0 голосов
/ 09 ноября 2018

Рассмотрим простой класс:

class MyInt {
public:
    MyInt();

    MyInt(const char *num);
};

Я хочу интегрировать шаблон дизайна подсчета ссылок в класс, что означает, что мне нужно отслеживать, сколько указателей указывают на экземпляр этого класса. Мне нужно реализовать его только в этом классе или создать другой класс и наследовать его.

Учитывая этот пример кода, я хочу очистить любую выделенную память программы:

int main() {
    MyInt*a = new MyInt("10");
    a = new MyInt("20");
    delete a;
    return 0;
}

Мои попытки

Я попытался oveloading оператора '=' и добавление элемента referenceCount:

MyInt &MyInt::operator=(const MyInt* right) {
    MyInt*left = this;
    *this = right;
    left->referenceCount -= 1;
    if (left->referenceCount == 0) {
        delete (left);
    }
    return *this;
}

Но это не работает, потому что мы присваиваем указатель класса другому указателю.

Также пытался переопределить операторы new и delete, но, похоже, не может заставить его работать и отслеживать количество указателей на экземпляр.

Как мне кажется, мне нужно реализовать четыре вещи: конструктор копирования, оператор new, оператор delete и operator =.

Как эффективно отслеживать указатели и автоматически очищать неопознанную память?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

a - указатель, поэтому присвоение a не будет включать MyInt::opterator= в любом случае. Невозможно определить, когда указатель на T назначен путем перегрузки операторов T. Для этого вам нужно создать тип class, который будет вести себя как указатель. Тогда вы сможете правильно отследить, когда указатель может протечь объект, и правильно удалить его. К счастью для вас, стандартная библиотека уже обеспечивает это class. Это std::shared_ptr. Вот ваш пример, модифицированный для использования std::shared_ptr:

#include <memory>

struct InfInt {
    InfInt(const char *) {}
};

int main() 
{
    auto a = std::make_shared<InfInt>("10");
    a = std::make_shared<InfInt>("20"); // the previous `a` is deleted

    // The object pointed to by `a` is automatically deleted when 
    //  the last reference to it goes out of scope
    return 0;   
}
0 голосов
/ 09 ноября 2018

std::shared_ptr делает именно это. Из ссылки:

Управляет хранением указателя, предоставляя ограниченный средство для сбора мусора , возможно, поделится этим управлением с другие объекты. [...] После того, как все объекты shared_ptr имеют общую собственность через указатель освободили это владение, управляемый объект Исключен.

поэтому я предлагаю вам использовать это.

...