堆指针分配之间的差异

1 c++ heap pointers

我有以下数据结构:

struct Inner
{
    int myValue;
};

struct Outer
{
    Inner* inner;
};
Run Code Online (Sandbox Code Playgroud)

选项1

如果我执行以下操作:

Outer outer;
outer.inner = NULL;

outer.inner = new inner;
inner* pInner = outer.inner;
Run Code Online (Sandbox Code Playgroud)

然后为以下2个值添加监视:

  • outer.inner
  • 平纳

那么它们都是非NULL,并且值相等.

选项2

如果我执行以下操作:

Outer outer;
outer.inner = NULL;

inner* pInner = outer.inner;
if (! pInner)
{
    pInner = new inner;
}
Run Code Online (Sandbox Code Playgroud)

然后pInner指向有效的堆内存,而outer.inner仍为NULL.

问题

  1. 为什么选项不同 - 它们是否应该同时指向选项2中的相同内存?

  2. 假设我使用选项1,然后我从内部读取值.然后我可以互换使用pInner和outer.inner不能吗?为什么分配内存会有所不同?

sth*_*sth 6

指针存储存储器地址.在第一个选项中,存储由new innerin 分配的对象的内存位置outer.inner.然后将该值复制到,pInner并且两个变量都包含相同的地址.

在第二个选项中,首先outer.inner设置为包含地址NULL.复制此值pInner并且两个变量都包含NULL.之后pInner更改为包含新分配的对象的地址,但存储的地址outer.inner不受此影响.那个地址仍然是NULL.

指针只是恰好是内存地址的数字.不同的赋值与变量声明为相同int.这些数字实际上内存地址只有变得有趣时,*->用于取消引用指针.两个不同的指针变量可能指向相同的地址,但它们仍然是不同的变量.