请教内存映射文件地址的生命期,只能声明为全局内核对象吗?

66766 2010-05-13 01:30:44
我在函数过程中创建了一个内存映射文件对象
这个函数返回了视图的地址
我在其他地方读写这个地址的数据

请问,如果我继续分配了其他内存,会覆盖这个内存映射文件的地址吗。
似乎我这个内存映射文件对象是局部的,我在函数内创建这个内存映射文件对象
系统会一直为我保留这段地址,不分配给其他对象吗。
...全文
79 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ytfrdfiw 2010-05-13
  • 打赏
  • 举报
回复
如果你是通过createfilemapping来创建一个内存映射文件,则只有进程结束或你显示的closehandle,此内存映射才会消失。
66766 2010-05-13
  • 打赏
  • 举报
回复
是不是需要我写足够多的数据,才会暴露出问题,例如
void fneicunyingshe(void)
{
void * pbfile;

pbfile=ffile("test1.txt",10);
fdata(pbfile,"test1");
pbfile=ffile("test2.txt",10);
fdata(pbfile,"test2");
pbfile=ffile("test3.txt",10);
fdata(pbfile,"test3");
。。。
}
这些文件的内容是否会发生混乱
66766 2010-05-13
  • 打赏
  • 举报
回复
是这样的,为什么我能得到正确的结果,是不是这样的代码非常危险。
void * ffile(char * name,int size)
{
HANDLE hfile;
HANDLE hfilemap;
void * pbfile;

hfile=CreateFile(name,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);

hfilemap=CreateFileMapping(hfile,
NULL,
PAGE_READWRITE|SEC_COMMIT,
0,
size,
NULL);

pbfile=MapViewOfFile(hfilemap,
FILE_MAP_WRITE,
0,
0,
size);

return pbfile;
}

void fdata(void * pbfile,char * data)
{
char *p=(char *)pbfile;
strcpy(p,data);
}

void fneicunyingshe(void)
{
void * pbfile;

pbfile=ffile("test.txt",10);
fdata(pbfile,"test");

}
KevinHo 2010-05-13
  • 打赏
  • 举报
回复
LZ,这就要看你是用什么方式分配了,如果用的是类似于new(),malloc(),realloc()这样的函数,即便是出了函数,也不会收回这些内存的,因为这是堆分配的,必须由delete或者是free()来释放,系统是不会自己释放、覆盖的。
zhjuan 2010-05-13
  • 打赏
  • 举报
回复
对于局部对象:是保存在栈的数据区的,当程序跑出局部对象所在的区域时,将释放该局不对象。
“系统会一直为我保留这段地址,不分配给其他对象吗。“所以肯定不会啦!但在系统没有再次分配内存覆盖掉局部对象所在内存时,这个对象的数据还是有效的。
冻结 2010-05-13
  • 打赏
  • 举报
回复
楼主去查“堆”和“栈”吧。
明白了“堆”和“栈”,
你就不会再有这样的问题了。
dinjay 2010-05-13
  • 打赏
  • 举报
回复
既然你都说是函数内创建的了,那肯定出了函数就释放掉了。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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