C/C++指针问题

gav*_*gav 5 c++ pointers

tl; dr - 你能否在下面的第一个代码片段中展开4条评论?具体是什么意思是deref

我是一名希望学习C++的Java开发人员.在我的情况下,我遇到了针对开发人员的网站.

   int x, *p, *q;
   p = new int;
   cin >> x;
   if (x > 0) q = &x;
   *q = 3;                 // 1. deref of possibly uninitialized ptr q
   q = p;
   p = new int;            // 2. potential storage leak (if x != 0 this
                           //     memory will not be returned to free storage)
   *p = 5;
   delete q;
   *q = 1;                 // 3. deref of deleted ptr q
   q = p;
   if (x == 0) delete q;
   (*p)++;                 // 4. deref of possibly dangling ptr p (if x is zero)
Run Code Online (Sandbox Code Playgroud)

虽然我认为我理解了指针是如何工作的,但我发现这些评论很难理解.

我的看法;

  1. 我们要么指定x(&*q当然)为3 OR如果q!=&x则q具有正确值,因为它是未初始化的,我们刚刚为值3分配了一块随机内存.我不是确定如何取消引用未初始化的内容?
  2. 这可以
  3. 取消引用已删除的指针有什么问题?'删除q'之后*q无意义?
  4. 悬挂指针有什么问题?现在我们已经删除它,即使我们仍然有指向它的指针,内存是否可用于重新分配?

我认为我的基本误解只是声明一个int指针,这也分配了内存吗?它是在堆栈还是堆上?

取消引用也意味着"读取指针地址的值"?我认为我的困惑在于我将其解释为丢失对某些数据的引用,如同;

int *x;
x = new int;
*x = 5;
x = new int; // Dereferencing the first bit of memory allocated.
Run Code Online (Sandbox Code Playgroud)

谢谢你的耐心,我希望这是一个有意义的问题,

GAV

dir*_*tly 6

简单地说:指针是您可能感兴趣的变量的地址.

*解除引用是访问该值的行为 - 通过将(解除引用操作符)添加到指针变量.访问可以是阅读,写作或两者.

  1. 如果没有初始化指向有效地址的指针(或特殊值NULL) - 您不知道该变量包含什么.解除引用将尝试采取任何在那里并将其视为地址.这是未定义的行为 - 所有赌注都关闭,任何事情都可能发生,但如果你很幸运,你最终会遇到陷阱/硬件异常.

  2. 究竟.因为,p持有你分配的一些内存的地址.不释放系统资源会导致泄漏.取消引用已删除的指针与取消引用未初始化的指针相同 - 您不知道它可能包含的值.

  3. 再次,UB.

  4. 真正.你有UB x == 0.悬挂指针是危险的,因为它们在最不合适的时间爬行,格式化你的硬盘并且再也看不到了.无法合理地证明程序的行为方式.