2016-10-10 126 views
-5

我正在用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功能,我创建的堆内存,以确保它指向局部变量x的地址指针y将函数执行后返回。然后我想取消分配y的内存,但是当我删除指针p时出现main错误... 您能看到这里出了什么问题吗?提前致谢。

+2

你只能'删除'用'new'创建的内容。 '&x'指向栈上的一个地址。你的意思是写'* y = x;'? –

+0

'delete'只能用于'new' – roottraveller

+2

你正在返回并且是局部变量的地址。未定义的行为 – Raindrop7

回答

3

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

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

0

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

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

第三个错误是:调用堆栈内存上的删除将发出断言。

要做的正确事情:使指针仅存储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; 
} 
0

随着“新”你堆动态分配内存,你有责任disallocate此内存。你用'删除'来做。如果将var x指定给指针,则不再有权访问此内存。

0

delete学习的第一件事就是它不会删除指针

删除对象指针指向

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

不是?!?那么首先要了解y = &x*y = x之间的差异。

new返回的指针在哪里?

它被存储在y。然后y(一个指针)收到x的地址。旧地址已经消失。忘记了。蒸发。 new返回的int自由浮动程序员堆空间没有什么更能够捕捉它。你第一次内存泄漏。

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