简而言之 - 请详细解释下面第一个代码片段中的4条评论。具体来说,deref是什么意思?
我是一名长期从事Java开发的人,想要学习C ++。我偶然发现了这个网站,它针对和我一样的开发人员。
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)
尽管我认为我理解指针的工作原理,但我发现很难理解这些注释。
我的理解:
1.我们要么将x(&*q)赋值为3,要么如果q!=&x,则q具有初始值,因为它未初始化,我们刚刚将一个随机内存片段分配给了值3。我不确定如何引用未初始化的内容?
2.这个没问题
3.删除指针后,解引用已删除的指针有什么问题?* q毫无意义吗?
4.悬挂指针有什么问题?既然我们已经删除了它,即使我们仍然拥有指向它的指针,该内存是否适用于重新分配?
我想我的基本误解就在于只声明int指针,这样是否也会分配内存?它在堆栈上还是堆上?
另外,解引用是否只是“读取指针地址处的值”?我觉得我困惑的是,我将其解释为丢失对某些数据的引用,例如;
int *x;
x = new int;
*x = 5;
x = new int; // Dereferencing the first bit of memory allocated.
感谢您的耐心等待,我希望这个问题有些意义。Gav