删除指针问题

deleting a pointer issue

本文关键字:问题 指针 删除      更新时间:2023-10-16

我正在C++中尝试"new"-"delete"和内存分配。在以下程序中:

int* getPtrToFive() {    
    int x =5;
    int *y = new int;
    y = &x;
    return y;
}
int main() {
   int *p = getpoint();
   cout << *p << endl;
   delete p;
}

getpoint函数中,我在堆中创建内存,以确保指向局部变量x地址的指针y在函数执行后返回。然后我想解除分配y的内存,但当我删除指针p时,main中出现错误。。。你能看到这里出了什么问题吗?提前谢谢。

y = &x;在这里,您可以将"y"设置为指向除已分配内存之外的其他对象。它不再指向可以删除的动态分配内存。

此外,由于现在没有指针指向动态分配的内存,您还创建了内存泄漏。

使用"new"可以在堆上动态分配内存,并负责取消分配此内存。你可以用"删除"来完成。如果将var x分配给指针,您将无法再访问此内存。

在您的示例中,存在内存泄漏:您在堆上创建y,而不释放它,您将另一个地址分配给y(x的堆栈内存(,因此用new分配的内存已经泄漏。

第二个灾难是:返回一个局部变量(&x(。因此,在函数x返回之后,它将被破坏,因此您将面临一个未定义的行为。

第三个错误是:在堆栈内存上调用delete,这将发出断言。

正确的做法是:使指针只存储x的值,而不是地址,并返回该指针。总之,只要指针在堆上,你就可以删除它:

int* getPtrToFive() 
{    
    int x = 5;
    int *y = new int(x); // y points to an address on the heap not to x's. we store value of x in pointer
    return y;
}
int main()
{
   int *p = getpoint();
   cout << *p << endl;
   delete p;
}

使用delete的第一件事是它不会删除指针

删除指针指向的对象

现在:调用delete时,p指向什么?它指向getPtrToFive内部的本地x,因为y = &x就是这样做的,而不再指向new返回的匿名者。这就是你想要的(你真正想要的(吗?

不?!?则首先了解CCD_ 14与CCD_。

new返回的指针在哪里?

它存储在y中。然后y(一个指针(收到了x的地址。原来的地址已经不见了。被遗忘了。蒸发。new返回的int在程序员堆空间中自由浮动,再也抓不到它了。

那么删除p是什么呢?它试图将一块不属于它的内存返回到程序堆:它属于堆栈。你很幸运,运行时支持捕捉到了它。