初学C++,请教关于new和delete的问题。

Samerol_Jomior 2013-09-23 09:10:35
这是代码。
#include <iostream>

using namespace std;

int main()
{
int* p = new int;
*p = 8;
cout<<*p<<endl;
delete p;
// p = new int;
*p = 100;
cout<<*p<<endl;
delete p;
return 0;
}


是这样的。我用new申请了一个内存,然后存入了8,然后将p所指向的内存释放掉。
这时我再用*p,存入100也可以成功。
我想问的是,*p所指向的内存不是已经释放掉了么?那么这个100存入了哪里?
如果我加上 p = new int ,得到的结果也是一样的。
所以,加上下面这行的 p = new int; 和不加有什么区别?
...全文
176 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Samerol_Jomior 2013-09-23
  • 打赏
  • 举报
回复
引用 13 楼 starytx 的回复:
[quote=引用 12 楼 u011144614 的回复:] [quote=引用 10 楼 starytx 的回复:] [quote=引用 7 楼 u011144614 的回复:] [quote=引用 6 楼 starytx 的回复:] 首先要理解“释放”的意思。我的理解是delete释放后,你new的空间不再受你支配和使用(或者说系统不保证你的读写还有效),所以你尝试往里存写数据,没有错误,但不代表可以这样使用,因为如果系统正好使用了这块内存,而你往其中写入数据后破坏了系统的数据可能引起严重的错误等情况发生。
也就是说,在delete之后,之前的指针指向哪里就不确定了,这是修改指针的值有可能会引起错误?[/quote]不是,delete不会改变指针的指向,指针还是指向new的地址,只是这地址标示的内存对于你已经失去了拥有权(虽然你还可以存取,但可能引起未知的错误)。[/quote] 对这块内存失去了使用权,别的东西就可以使用这块内存,如果再修改这块内存就有可能产生错误,这样理解对了吧?[/quote]是的,你修改的数据可能是重要数据,可能会引起灾难性错误,而你读取的数据也可能是别人的数据[/quote] 非常感谢。
starytx 2013-09-23
  • 打赏
  • 举报
回复
引用 12 楼 u011144614 的回复:
[quote=引用 10 楼 starytx 的回复:] [quote=引用 7 楼 u011144614 的回复:] [quote=引用 6 楼 starytx 的回复:] 首先要理解“释放”的意思。我的理解是delete释放后,你new的空间不再受你支配和使用(或者说系统不保证你的读写还有效),所以你尝试往里存写数据,没有错误,但不代表可以这样使用,因为如果系统正好使用了这块内存,而你往其中写入数据后破坏了系统的数据可能引起严重的错误等情况发生。
也就是说,在delete之后,之前的指针指向哪里就不确定了,这是修改指针的值有可能会引起错误?[/quote]不是,delete不会改变指针的指向,指针还是指向new的地址,只是这地址标示的内存对于你已经失去了拥有权(虽然你还可以存取,但可能引起未知的错误)。[/quote] 对这块内存失去了使用权,别的东西就可以使用这块内存,如果再修改这块内存就有可能产生错误,这样理解对了吧?[/quote]是的,你修改的数据可能是重要数据,可能会引起灾难性错误,而你读取的数据也可能是别人的数据
Samerol_Jomior 2013-09-23
  • 打赏
  • 举报
回复
引用 10 楼 starytx 的回复:
[quote=引用 7 楼 u011144614 的回复:] [quote=引用 6 楼 starytx 的回复:] 首先要理解“释放”的意思。我的理解是delete释放后,你new的空间不再受你支配和使用(或者说系统不保证你的读写还有效),所以你尝试往里存写数据,没有错误,但不代表可以这样使用,因为如果系统正好使用了这块内存,而你往其中写入数据后破坏了系统的数据可能引起严重的错误等情况发生。
也就是说,在delete之后,之前的指针指向哪里就不确定了,这是修改指针的值有可能会引起错误?[/quote]不是,delete不会改变指针的指向,指针还是指向new的地址,只是这地址标示的内存对于你已经失去了拥有权(虽然你还可以存取,但可能引起未知的错误)。[/quote] 对这块内存失去了使用权,别的东西就可以使用这块内存,如果再修改这块内存就有可能产生错误,这样理解对了吧?
FrankHB1989 2013-09-23
  • 打赏
  • 举报
回复
既然初学C++,先去了解清楚undefined behavior,搞清楚什么时候结果是可以指望的。
starytx 2013-09-23
  • 打赏
  • 举报
回复
引用 7 楼 u011144614 的回复:
[quote=引用 6 楼 starytx 的回复:] 首先要理解“释放”的意思。我的理解是delete释放后,你new的空间不再受你支配和使用(或者说系统不保证你的读写还有效),所以你尝试往里存写数据,没有错误,但不代表可以这样使用,因为如果系统正好使用了这块内存,而你往其中写入数据后破坏了系统的数据可能引起严重的错误等情况发生。
也就是说,在delete之后,之前的指针指向哪里就不确定了,这是修改指针的值有可能会引起错误?[/quote]不是,delete不会改变指针的指向,指针还是指向new的地址,只是这地址标示的内存对于你已经失去了拥有权(虽然你还可以存取,但可能引起未知的错误)。
Samerol_Jomior 2013-09-23
  • 打赏
  • 举报
回复
引用 4 楼 max_min_ 的回复:
加上下面这行的 p = new int; 和不加有什么区别? 显然有区别的! 不加的话,p的地址是无效的(也就是所谓的野指针)!虽然有时能获取到有效值,那是因为内存空间没有及时擦除而已! 加的话,地址才是有效的!只要不释放,获取的数据就都是有效的!能够正确获取到!
非常感谢
Samerol_Jomior 2013-09-23
  • 打赏
  • 举报
回复
引用 3 楼 modyaj 的回复:
我想问的是,*p所指向的内存不是已经释放掉了么?那么这个100存入了哪里?---释放了内存后 p所指向的内存空间不定 此时写入100是危险的行为
非常感谢
Samerol_Jomior 2013-09-23
  • 打赏
  • 举报
回复
引用 6 楼 starytx 的回复:
首先要理解“释放”的意思。我的理解是delete释放后,你new的空间不再受你支配和使用(或者说系统不保证你的读写还有效),所以你尝试往里存写数据,没有错误,但不代表可以这样使用,因为如果系统正好使用了这块内存,而你往其中写入数据后破坏了系统的数据可能引起严重的错误等情况发生。
也就是说,在delete之后,之前的指针指向哪里就不确定了,这是修改指针的值有可能会引起错误?
starytx 2013-09-23
  • 打赏
  • 举报
回复
首先要理解“释放”的意思。我的理解是delete释放后,你new的空间不再受你支配和使用(或者说系统不保证你的读写还有效),所以你尝试往里存写数据,没有错误,但不代表可以这样使用,因为如果系统正好使用了这块内存,而你往其中写入数据后破坏了系统的数据可能引起严重的错误等情况发生。
baichi4141 2013-09-23
  • 打赏
  • 举报
回复
内存是永远存在的,不管你是否申请了是否释放了,100永远存在p指向的那个内存地址 区别在于,如果你没申请或者你释放了,那么这块内存就随时可能被用来做别的事情,也就是你存了100,下次读取这块内存的结果可能还是100,也可能是123456789,具体是什么跟其他代码有关
max_min_ 2013-09-23
  • 打赏
  • 举报
回复
加上下面这行的 p = new int; 和不加有什么区别? 显然有区别的! 不加的话,p的地址是无效的(也就是所谓的野指针)!虽然有时能获取到有效值,那是因为内存空间没有及时擦除而已! 加的话,地址才是有效的!只要不释放,获取的数据就都是有效的!能够正确获取到!
modyaj 2013-09-23
  • 打赏
  • 举报
回复
我想问的是,*p所指向的内存不是已经释放掉了么?那么这个100存入了哪里?---释放了内存后 p所指向的内存空间不定 此时写入100是危险的行为
Samerol_Jomior 2013-09-23
  • 打赏
  • 举报
回复
引用 1 楼 turingo 的回复:
delete之后,p所指向的内存已经被回收,最好同时把p=NULL,不然就成为野指针了。也就是说其它的代码段可能会用到这块内存,这样你用p去修改它的内容,会造成其它地方的不正常,甚至是崩溃。 [quote=引用 楼主 u011144614 的回复:] 这是代码。
#include <iostream>

using namespace std;

int main()
{
    int* p = new int;
    *p = 8;
    cout<<*p<<endl;
    delete p;
 // p = new int;
    *p = 100;
    cout<<*p<<endl;
    delete p;
    return 0;
}
是这样的。我用new申请了一个内存,然后存入了8,然后将p所指向的内存释放掉。 这时我再用*p,存入100也可以成功。 我想问的是,*p所指向的内存不是已经释放掉了么?那么这个100存入了哪里? 如果我加上 p = new int ,得到的结果也是一样的。 所以,加上下面这行的 p = new int; 和不加有什么区别?
[/quote] 内存释放掉之后,100这个值存在了哪里呢?
图灵狗 2013-09-23
  • 打赏
  • 举报
回复
delete之后,p所指向的内存已经被回收,最好同时把p=NULL,不然就成为野指针了。也就是说其它的代码段可能会用到这块内存,这样你用p去修改它的内容,会造成其它地方的不正常,甚至是崩溃。
引用 楼主 u011144614 的回复:
这是代码。
#include <iostream>

using namespace std;

int main()
{
    int* p = new int;
    *p = 8;
    cout<<*p<<endl;
    delete p;
 // p = new int;
    *p = 100;
    cout<<*p<<endl;
    delete p;
    return 0;
}
是这样的。我用new申请了一个内存,然后存入了8,然后将p所指向的内存释放掉。 这时我再用*p,存入100也可以成功。 我想问的是,*p所指向的内存不是已经释放掉了么?那么这个100存入了哪里? 如果我加上 p = new int ,得到的结果也是一样的。 所以,加上下面这行的 p = new int; 和不加有什么区别?

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧