С ++ область видимости в куче - PullRequest
0 голосов
/ 04 января 2019

Почему я получаю вывод как 10 после удаления его области действия?Я создал класс A , в котором есть переменная-член типа указателя, и другой класс B, в котором есть еще одна переменная-член x .Теперь я выделяю память в куче для B со значением 10 для x .Для создания экземпляра класса A я использовал адрес памяти x .Сейчас я удаляю объект b и печатаю значение указателя ref класса A .Я получаю, почему я получаю вывод как 10 , поскольку мы видим, что память, содержащая это значение, больше не сохраняется в куче?

#include<iostream>
using namespace std;

class A
{    
   public:
   int *ref;
   A(int *ref):ref(ref)
   {
   }
};

class B{
   public:
   int x;
   B(int x):x(x){}
};

int main()
{
   B *b=new B(10);
   A a(&b->x);
   delete b;
   cout<<*a.ref<<endl; 
}

Ответы [ 3 ]

0 голосов
/ 04 января 2019

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

0 голосов
/ 04 января 2019

Это из-за эффекта висящего указателя.Несмотря на то, что мы удалили данные из памяти, они еще не стерты или другие данные там не хранятся, и наш указатель все еще указывает на эту память.

для справки https://www.geeksforgeeks.org/dangling-void-null-wild-pointers/

0 голосов
/ 04 января 2019

Это неопределенное поведение.Например, когда я запускаю ваш пример в MSVC, у меня выводится -572662307.

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

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

Память больше не действительна, но число 10 может все еще находиться в этой памяти, и a.ref все еще указывает на эту память.Таким образом, даже если память не действительна, 10 может сохраняться.

...