О сборке мусора в C ++ - PullRequest
3 голосов
/ 21 июня 2011

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

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

Спасибо!

Ответы [ 2 ]

6 голосов
/ 21 июня 2011

Проблема висячих указателей решается косвенно: в среде GC объект удаляется только тогда, когда нет указателей, которые ссылаются на объект, и, как таковой, он не будет удален в любом случае, когда он оставит висячийуказатель.То есть не будет вообще никаких висячих указателей, и проблема не может возникнуть.

0 голосов
/ 21 июня 2011

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

class Sample
{
public:
        int *ptr;
        Sample(int i)
        {
            ptr = new int(i);
        }

        ~Sample()
        {
            delete ptr;
        }
        void PrintVal()
        {
            cout << "The value is " << *ptr;
        }
};

void SomeFunc(Sample x)
{
    cout << "Say i am in someFunc " << endl;
}

int main()
{
    Sample s1 = 10;
    SomeFunc(s1);
    s1.PrintVal();
}

В приведенном выше примере, когда функция PrintVal () называется он вызывается указателем, который был освобожден деструктор в SomeFunc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...