删除指针问题
deleting a pointer issue
我正在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是什么呢?它试图将一块不属于它的内存返回到程序堆:它属于堆栈。你很幸运,运行时支持捕捉到了它。
- 关于 c++ 函数中指针赋值的简单问题
- 链表指针问题
- C++ 关于指针取消引用的技术问题
- C++中的指针和常量问题不大
- 包含矢量指针的结构的内存释放问题
- 指针问题:从不兼容的类型"int"分配给"int *"
- 将字节数组转换为带有字节序问题的指针
- 关于如何使用指向主窗口的指针的 QT 问题
- 当成员值从指针更改为非指针时,C++常量问题
- 为什么循环会导致指针出现问题?
- 使用指针计算堆栈问题的大 O 表示法
- 构造函数 (C++) 中的 char 指针参数存在问题
- 指向包含对齐 C 结构C++类的 C 指针的对齐问题
- 涉及指针和手动实现的矩阵类的问题
- 从基指针到派生的强制转换问题
- 迭代器的指针操作问题
- 64 位迁移问题:指针更改
- C++模板使用问题指针
- 跳到C++第13章练习问题4-指针
- 用std::pair数组初始化std::map问题(指针错误?)