我正在尝试使用“新” - “删除”和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
中收到错误...
你能看到这里出了什么问题吗?提前致谢。
答案 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然后是什么?它试图返回程序堆一段不属于它的内存:它属于堆栈。你很幸运,运行时支持就抓住了它。