删除指针问题

时间:2016-10-10 11:27:36

标签: c++ pointers

我正在尝试使用“新” - “删除”和C ++中的内存分配。在以下程序中:

int* getPtrToFive() {    
    int x =5;
    int *y = new int;
    y = &x;

    return y;
}

int main() {
   int *p = getpoint();
   cout << *p << endl;
   delete p;
}

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

4 个答案:

答案 0 :(得分:3)

y = &x;在此设置“y”指向除分配的内存之外的其他内容。它不再指向可以删除的动态分配的内存。

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

答案 1 :(得分:0)

在你的例子中有一个内存泄漏:你在堆上创建y并且没有释放它你为y分配另一个地址(x的堆栈内存)所以分配了new的内存已经泄漏。

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

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

正确的事情:使指针只存储x的值而不是地址并返回该指针。在main中,你可以删除指针,只要它在堆上:

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;
}

答案 2 :(得分:0)

使用&#39; new&#39;你在堆上动态分配内存,你有责任解除分配这个内存。你可以用&#39;删除&#39;来实现。如果将var x指定给指针,则无法再访问此内存。

答案 3 :(得分:0)

使用delete首先要学习的是它不会删除指针

删除对象指针指向

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

没有?!?然后首先了解y = &x*y = x之间的差异。

new返回的指针在哪里?

它存储在y中。然后y(指针)收到x的地址。旧址已经消失了。忘记了。蒸发。而int返回的new可以自由地浮动程序员堆空间,而无法捕获它。你第一次内存泄漏。

删除p然后是什么?它试图返回程序堆一段不属于它的内存:它属于堆栈。你很幸运,运行时支持就抓住了它。