
从MSDN的官方解释来说,GetBuffer是将字符串的缓冲区长度锁定,releaseBuffer是解除锁定,那么在进行CString *** 作前,应该releaseBuffer。
其实从底层代码上看,是这样的,MessageBox(k1)不报错,是因为地址空间确实已经赋值,内存中有东西。但实际上,在release之前,不仅GetAt报错,GetLength获取到的长度是0,那么为什么呢,我们看ReleaseBuffer的底层代码:
void CString::ReleaseBuffer(int nNewLength)
{
CopyBeforeWrite(); // just in case GetBuffer was not called
if (nNewLength == -1)
nNewLength = lstrlen(m_pchData); // zero terminated
ASSERT(nNewLength <= GetData()->nAllocLength);
GetData()->nDataLength = nNewLength;
m_pchData[nNewLength] = '\0';
}
void CString::CopyBeforeWrite()
{
if (GetData()->nRefs > 1)
{
CStringData pData = GetData();
Release();
AllocBuffer(pData->nDataLength);
memcpy(m_pchData, pData->data(), (pData->nDataLength+1)sizeof(TCHAR));
}
ASSERT(GetData()->nRefs <= 1);
}
从这里可以看出,其实CString的各种变量,在ReleaseBuffer之前,是没有被更新的,而GetAt函数需要获取CString长度,并且通过GetData来获取数据(而不是直接从内存),这样肯定会出现断言错误。
如果希望GetBuffer并进行内存 *** 作之后,CString各种功能,只能先调用ReleaseBuffer更新CString数据才可以。
关于1:U盘对病毒的传播要借助autoruninf文件的帮助,病毒首先把自身复制到u盘,然后创建一个autoruninf,在你双击u盘时,会根据autoruninf中的设置去运行u盘中的病毒,我们只要可以阻止autoruninf文件的创建,那么U盘上就算有病毒也只能躺着睡大觉了,大家可能也想到这个,但是不管给autoruninf设置了什么属性,病毒都会更改它,我提到的方法就是,在根目录下,删除autoruninf文件,然后,根目下建立一个文件夹,名字就叫autoruninf,这样一来,因为在同一目录下,同名的文件和文件夹不能共存的原理,病毒就无能为力,创建不了autoruninf文件了,以后会不会出新病毒,自动去删文件夹,然后再建立文件就不知道了,但至少现阶段,这种方法是非常有效的。
应对策略
1、在插入U盘时按住键盘 shift 键直到系统提示“设备可以使用”,然后打开U盘时不要双击打开,也不要用右键菜单的打开选项打开,而要使用资源管理器(打开我的电脑,按下上面的“文件夹”按钮,或者开始-所有程序-附件-windows资源管理器)将其打开,或者使用快捷键winkey+E打开资源管理器后,一定通过左侧栏的树形目录打开可移动设备!(要养成这样的良好习惯)
2、如果盘内有来路不明的文件,尤其是文件名比较诱惑人的文件,必须多加小心;需要特别提示的是,不要看到图标是文件夹就理所当然是文件夹,不要看到图标是记事本就理所当然是记事本,伪装图标是病毒惯用伎俩。
3、要有显示文件扩展名的习惯 。方法:打开“我的电脑”,工具--文件夹选项--查看,去掉“隐藏已知文件类型的扩展名”的勾,建议选择显示扩展名同时选上“显示隐藏文件”,去掉“不显示系统文件”的勾,这样可以对病毒看得更清楚。有图标的诱人的病毒文件基本都是可执行文件,显示文件扩展名之后,通过文件名后的"exe"即可判断出一个文件可执行文件,从而不会把伪装的病毒可执行文件误认为是正常文件或文件夹。
4、最后不管你用什么办法,或者用什么软件,插入U盘然后用这个方法检验你有没有中Autoruninf型病毒的风险。
关于2:这个基本没什么问题,打开ie时杀毒软件会占用大量内存,如果你的系统cpu和内存不是特别强大的话就会卡。杀毒软件一般都会占用大量内存。卡巴斯基最为突出。
关于3:agentsvrexe是一个ActiveX插件,用于多媒体程序。这不是纯粹的系统程序,但是如果终止它,可能会导致不可知的问题。
eouwizexe :Intel无线网络相关程序。
RSTrayexe是瑞星卡卡上网安全助手60的实时监控程序。
dot1xcfgexe :Intel8021x无线网络适配器设置程序。
zcfgsvcexe是Intel零配置MFC程序,与网络相关设备安装。
iFrmewrkexe是Intel无线网卡相关软件。
RavTasKexe(瑞星任务计划程序)
taskmgrexe用于Windows任务管理器。
syntpenhexe是笔记本电脑触摸板相关程序。
wcourierexe 这是一个华硕的无线网络的相关程序
hcontrolexe是华硕键盘相关配置程序。
rasexe 瑞星卡卡安全助手程序。
rfwmainexe 瑞星防火墙主程序
daemonexe是一个后台程序,用于打开例如iso之类的镜像文件,做成虚拟光驱文件。
atkosdexe是华硕笔记本电脑驱动程序的文件。
ctfmonexe是Microsoft Office产品套装的一部分。它可以选择用户文字输入程序,和微软Office XP语言条。这不是纯粹的系统程序,但是如果终止它,可能会导致不可知的问题。
knownsvrexe是瑞星卡卡上网安全助手60的相关进程,每次启动卡卡时即出现。
notepadexe是Windows自带的记事本程序svchostexe是一个属于微软Windows *** 作系统的系统程
algexe是微软Windows *** 作系统自带的程序。它用于处理微软Windows网络连接共享和网络连接防火墙。
wdfmgrexe是微软microsoftwindowsmedi
mfc数组变量的内存地址变了的原因有数组越界、内存分配问题、数据类型不匹配、程序逻辑问题。
1、数组越界:当数组访问越界,导致程序崩溃或者出现不可预期的行为,此时数组的内存地址可能会发生变化。
2、内存分配问题:当在程序运行时分配了内存,但没有正确地释放内存,会导致内存泄漏,此时数组的内存地址也可能会发生变化。
3、数据类型不匹配:在MFC中,数组变量的数据类型可能与其他变量或函数返回值的数据类型不匹配,如果没有正确转换数据类型,会导致数组的内存地址发生变化。
4、程序逻辑问题:在程序设计中,对数组的 *** 作逻辑不严谨或者存在其他逻辑问题,会导致数组的内存地址发生变化。
以上就是关于MFC CString::GetBuffer全部的内容,包括:MFC CString::GetBuffer、MFC 中 关于获取U盘信息的方法,详情见描述。、mfc数组变量的内存地址变了等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)