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)
虽然我认为我理解了指针是如何工作的,但我发现这些评论很难理解.
我的看法;
我认为我的基本误解只是声明一个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
简单地说:指针是您可能感兴趣的变量的地址.
*解除引用是访问该值的行为 - 通过将(解除引用操作符)添加到指针变量.访问可以是阅读,写作或两者.
如果没有初始化指向有效地址的指针(或特殊值NULL) - 您不知道该变量包含什么.解除引用将尝试采取任何在那里并将其视为地址.这是未定义的行为 - 所有赌注都关闭,任何事情都可能发生,但如果你很幸运,你最终会遇到陷阱/硬件异常.
究竟.因为,p持有你分配的一些内存的地址.不释放系统资源会导致泄漏.取消引用已删除的指针与取消引用未初始化的指针相同 - 您不知道它可能包含的值.
再次,UB.
真正.你有UB x == 0.悬挂指针是危险的,因为它们在最不合适的时间爬行,格式化你的硬盘并且再也看不到了.无法合理地证明程序的行为方式.