int a = 10;
int* ptrA = &a;
int* ptrB = &a;
delete ptrA;
return 0;
Run Code Online (Sandbox Code Playgroud)
这不应该导致泄漏,导致mem/data被释放ptrA,但是我们有2个指向有效地址的指针,其数据刚被删除?它是如何工作的?
它是如何工作的?
不完全的.首先,您有未定义的行为,您无法删除具有自动存储的对象(例如,在堆栈上).
让我们改变你的例子:
int* ptrA = new int{10};
int* ptrB = ptrA;
delete ptrB;
return 0;
Run Code Online (Sandbox Code Playgroud)
但是我们有2个指针指向一个有效的地址,其数据刚被删除?
好吧,两个.确实有两个指针,指向相同的值.
如果您打印的价值ptrA和ptrB,你会看到类似的东西:
0x0034ab56
0x0034ab56
Run Code Online (Sandbox Code Playgroud)
两个指针都指向内存中的相同地址.
换句话说,如果删除ptrA,您将在地址处取消分配对象0x0034ab5.由于两个指针都指向同一个地址,因此两个指针现在都是悬空的.它的官方称谓是一个无效的指针值,都ptrA和ptrB因为它的存储是无效的指针值都以已释放的指针分别指向了.