简单内存的问题

听海拉拉 2010-10-22 05:17:10
 #include<string.h>
#include<iostream.h>
using namespace std;
int main()
{
char *str=NULL;
//char *str1="hello"
str=new char[100];
strcpy(str,"hello");
delete []str;
cout<<str<<endl;
if(str != NULL)
{
strcpy(str,"world!");
printf(str);
}
cout<<"ni hao"<<endl;
system("pause");
}

str不是delete了吗,怎么if(str!=NULL)还成立呢?
而且cout<<str<<endl;输出没有东西,空白的。在dev C++下编译。
...全文
157 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
libinfei8848 2010-10-25
  • 打赏
  • 举报
回复
系统对于可再分配物理内存用一系列的链表来表示的,逻辑地址要去映射物理地址的时候就从这个地方去获取,如果内存被锁定,那它暂时不加入到可分配链表中,放在另外的锁链表中
听海拉拉 2010-10-25
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 libinfei8848 的回复:]

系统对于可再分配物理内存用一系列的链表来表示的,逻辑地址要去映射物理地址的时候就从这个地方去获取,如果内存被锁定,那它暂时不加入到可分配链表中,放在另外的锁链表中
[/Quote]
是怎么锁定的?
听海拉拉 2010-10-24
  • 打赏
  • 举报
回复
哪位知道,请留下脚印
欣客 2010-10-22
  • 打赏
  • 举报
回复
这个原理还真说不出来,使用GloalLock 是申请的是动态的内存,所谓锁定是申请当前动态内存块的地址。当使用new 或allocate 不再会申请到当前的内存。
听海拉拉 2010-10-22
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 yangsen600 的回复:]
引用 14 楼 zouwen198317 的回复:
帖子加了40分,再问个问题

GlobalLock(hImageMemory_1); //锁定内存
GlobalUnlock(hImageMemory_1); //解锁内存
这两招是不是保证内存 期间不被野指针使用呢

锁定禁止被其他的指针访问,否则无须锁定。
[/Quote]
锁定的机制是怎么实现的?
libinfei8848 2010-10-22
  • 打赏
  • 举报
回复
野指针后也可能指向以前的内存,如果没有那块内存被重新分配了,这时候访问就有问题了,严重的会crash
千杯不醉-sen 2010-10-22
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zouwen198317 的回复:]
帖子加了40分,再问个问题

GlobalLock(hImageMemory_1); //锁定内存
GlobalUnlock(hImageMemory_1); //解锁内存
这两招是不是保证内存 期间不被野指针使用呢
[/Quote]
锁定禁止被其他的指针访问,否则无须锁定。
千杯不醉-sen 2010-10-22
  • 打赏
  • 举报
回复

delete[] str;
str = NULL;//习惯性动作
//否则str野指针
听海拉拉 2010-10-22
  • 打赏
  • 举报
回复
帖子加了40分,再问个问题

GlobalLock(hImageMemory_1); //锁定内存
GlobalUnlock(hImageMemory_1); //解锁内存
这两招是不是保证内存 期间不被野指针使用呢


liuyun213 2010-10-22
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zouwen198317 的回复:]

引用 10 楼 eclipse_2 的回复:
引用 9 楼 zouwen198317 的回复:

如果是野指针,那
if(str != NULL)
{
strcpy(str,"world!");
printf(str);
}
把world存进去,应该异常才对吧,
可试验结果是正常,说明应该还是指着那块内存


这个属于内存的管理了
new和delete只是把内存中的一……
[/Quote]
还是指向原来那块内存,不过不应该访问了,系统可以把它分配给其他人了
liuyun213 2010-10-22
  • 打赏
  • 举报
回复
delete 后它就指向了一块无效内存,一般要置为NULL
cout<<str<<endl; 改成cout<<(void)str<<endl;就输出地址了
听海拉拉 2010-10-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 eclipse_2 的回复:]
引用 9 楼 zouwen198317 的回复:

如果是野指针,那
if(str != NULL)
{
strcpy(str,"world!");
printf(str);
}
把world存进去,应该异常才对吧,
可试验结果是正常,说明应该还是指着那块内存


这个属于内存的管理了
new和delete只是把内存中的一块内存从free列表中分配出来和挂载回free列表……
[/Quote]
那就是说,delete之后,str成了野指针,即,他指的内存可能不是原来new的那块内存了?不知道是不是这个意思?
小魔菇 2010-10-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zouwen198317 的回复:]

如果是野指针,那
if(str != NULL)
{
strcpy(str,"world!");
printf(str);
}
把world存进去,应该异常才对吧,
可试验结果是正常,说明应该还是指着那块内存
[/Quote]

这个属于内存的管理了
new和delete只是把内存中的一块内存从free列表中分配出来和挂载回free列表中
delete表示内存是空闲的 可以被分配出去
这种情况是属于内存使用不高
如果内存使用高的话 当内存被delete之后 然后有另外一个进程new到了这块进程
strcpy使用的话就肯定会出现异常
听海拉拉 2010-10-22
  • 打赏
  • 举报
回复
如果是野指针,那
if(str != NULL)
{
strcpy(str,"world!");
printf(str);
}
把world存进去,应该异常才对吧,
可试验结果是正常,说明应该还是指着那块内存
听海拉拉 2010-10-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zhanzh 的回复:]
delete[] str;
//后需要自己置空
str = NULL;
否则str野指针,谁知道指哪了。
[/Quote]
怎么成野指针啦,不是还指向前面分配的那块内存吗 new char[100];
听海拉拉 2010-10-22
  • 打赏
  • 举报
回复

原来如此
cout<<str<<endl;
为何输出是空白的呢?应该输出一个地址值才对吧?
海流风光 2010-10-22
  • 打赏
  • 举报
回复
说的挺对的,再对str操作容易崩掉[Quote=引用 4 楼 ji1bing 的回复:]
指针指向的内存空间是被释放了
但是指针指向的内存地址并没有变

所以通常在释放内存后,会再接着跟一句
delete []str;
str = NULL;

特别是在类中,对于类的成员变量m_pStr 如果是指针的话,最好这么做
delete之后,再置空。
delete []m_pStr;
m_pStr = NULL;

如果后面还需要这个变量new的话
就判断一下,是空……
[/Quote]
zhanzh 2010-10-22
  • 打赏
  • 举报
回复
delete[] str;
//后需要自己置空
str = NULL;
否则str野指针,谁知道指哪了。
ji1bing 2010-10-22
  • 打赏
  • 举报
回复
指针指向的内存空间是被释放了
但是指针指向的内存地址并没有变

所以通常在释放内存后,会再接着跟一句
delete []str;
str = NULL;

特别是在类中,对于类的成员变量m_pStr 如果是指针的话,最好这么做
delete之后,再置空。
delete []m_pStr;
m_pStr = NULL;

如果后面还需要这个变量new的话
就判断一下,是空的话,再new,这样可以防止内存泄露
if(m_pStr == NULL)
{
m_pStr = new char[10];
}
奔跑的蜗牛 2010-10-22
  • 打赏
  • 举报
回复
指针指向的数据被delete了
指针中的值 是不会被自动赋空的
加载更多回复(2)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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