STL容器中放入wchar_t*指针出错 Vector中放入wchar_t*
来源:互联网 发布:蓝牙扫描app安卓源码 编辑:程序博客网 时间:2024/05/17 08:35
STL疑问#include <windows.h>class DistDrivers{public:virtual void GetLogicalDriveStrings()=0;public:int m_LogicalNum;//系统中逻辑驱动器的个数std::vector<wchar_t*> m_LogicalNames;//系统中所有的驱动器字符串的信息int m_DriveType;//驱动器类型float m_i64TotalBytes;//磁盘总容量float m_i64FreeBytesToCaller;//磁盘剩余容量};class MyDistDrivers:public DistDrivers{public:void GetLogicalDriveStrings(){TCHAR buf[100];DWORD len=::GetLogicalDriveStrings(sizeof(buf)/sizeof(WCHAR),buf);for(wchar_t* s=buf;*s;s+=wcslen(s)+1){LPTSTR sDrivePath=s;//单个盘符m_LogicalNames.push_back(sDrivePath);}vector<wchar_t*>::iterator iter=m_LogicalNames.begin();for(;iter!=m_LogicalNames.end();iter++){wcout<<*iter<<" ";}cout<<endl;}};int main(){DistDrivers *p=new MyDistDrivers();p->GetLogicalDriveStrings();MessageBox(NULL,*p->m_LogicalNames.begin(),*p->m_LogicalNames.begin(),NULL);return 0;}
出错的图片如下:
解释: 以上的程序犯了一个很原则的错误,就是局部变量的内存在他的生命期结束后就一定会释放他占用的内存。这时候,vector中包含的指针都是野指针。造成了程序的错误。
改正如下:
#include <windows.h>class DistDrivers{public:virtual DWORD GetLogicalDrives(void)=0;virtual void GetLogicalDriveStrings()=0;virtual UINT GetDriveType(LPCTSTR lpRootPathName)=0;virtual BOOL GetDiskFreeSpaceEx(LPCTSTR lpDirectoryName,PULARGE_INTEGER lpFreeBytesAvailable,PULARGE_INTEGER lpTotalNumberOfBytes,PULARGE_INTEGER lpTotalNumberOfFreeBytes)=0;public:int m_LogicalNum;//系统中逻辑驱动器的个数std::vector<wchar_t*> m_LogicalNames;//系统中所有的驱动器字符串的信息int m_DriveType;//驱动器类型float m_i64TotalBytes;//磁盘总容量float m_i64FreeBytesToCaller;//磁盘剩余容量LPTSTR sDrivePath;//新增加的变量 用来临时存储字符串。这个内存只会在程序结束的时候才会释放掉。 };
#include <string.h>#include <wchar.h>class MyDistDrivers:public DistDrivers{public:DWORD GetLogicalDrives(void){int DiskCount=0;DWORD DiskInfo=::GetLogicalDrives();while(DiskInfo){if(DiskInfo&1){++DiskCount;}DiskInfo=DiskInfo>>1;}m_LogicalNum=DiskCount;return m_LogicalNum;}void GetLogicalDriveStrings(){TCHAR buf[100];DWORD len=::GetLogicalDriveStrings(sizeof(buf)/sizeof(WCHAR),buf);for(wchar_t* s=buf;*s;s+=wcslen(s)+1){sDrivePath=s;//单个盘符sDrivePath=(WCHAR*)malloc(sizeof(WCHAR)*(wcslen(s)+1));wcscpy(sDrivePath,s);cout<<"Address of String[i]:"<<&sDrivePath<<endl;int i=0;m_LogicalNames.push_back(sDrivePath);cout<<"Address of String[i] in vector:"<<&m_LogicalNames.at(i)<<endl;i++;}}UINT GetDriveType(LPCTSTR lpRootPathName){return 1;}BOOL GetDiskFreeSpaceEx(LPCTSTR lpDirectoryName,PULARGE_INTEGER lpFreeBytesAvailable,PULARGE_INTEGER lpTotalNumberOfBytes,PULARGE_INTEGER lpTotalNumberOfFreeBytes){return TRUE;}};
#include <string.h>#include <wchar.h>class MyDistDrivers:public DistDrivers{public:DWORD GetLogicalDrives(void){int DiskCount=0;DWORD DiskInfo=::GetLogicalDrives();while(DiskInfo){if(DiskInfo&1){++DiskCount;}DiskInfo=DiskInfo>>1;}m_LogicalNum=DiskCount;return m_LogicalNum;}void GetLogicalDriveStrings(){TCHAR buf[100];DWORD len=::GetLogicalDriveStrings(sizeof(buf)/sizeof(WCHAR),buf);for(wchar_t* s=buf;*s;s+=wcslen(s)+1){sDrivePath=s;//单个盘符
//将局部变量s的内存拷贝到类成员变量sDrivePath中sDrivePath=(WCHAR*)malloc(sizeof(WCHAR)*(wcslen(s)+1)); wcscpy(sDrivePath,s);cout<<"Address of String[i]:"<<&sDrivePath<<endl;int i=0;m_LogicalNames.push_back(sDrivePath);cout<<"Address of String[i] in vector:"<<&m_LogicalNames.at(i)<<endl;i++;}}UINT GetDriveType(LPCTSTR lpRootPathName){return 1;}BOOL GetDiskFreeSpaceEx(LPCTSTR lpDirectoryName,PULARGE_INTEGER lpFreeBytesAvailable,PULARGE_INTEGER lpTotalNumberOfBytes,PULARGE_INTEGER lpTotalNumberOfFreeBytes){return TRUE;}};
以上就解决了这个问题。
- STL容器中放入wchar_t*指针出错 Vector中放入wchar_t*
- boost_shared_ptr放入set和vector中
- 类放入包中
- 把STL容器放入共享内存
- Vector的size()不能放入判断语句中
- Hadoop 往hdfs中放入文件的时候出错
- 如何在一个容器中放入不同对象
- 一个可以放入STL容器的简洁、高效、非计数的智能指针实现
- VC中wchar_t的使用
- wchar_t
- wchar_t
- wchar_t
- wchar_t
- wchar_t
- 将程序放入托盘中
- 将DropDownList放入GridView中
- ListView不可放入ScrollView中
- 将信息放入xml中
- android中 MediaStore提取缩略图和原始图像
- 对于网站优化要提供的一些建议
- C++中string类型与char *类型转换
- IOS Opengl ES 用多光源实现材质,阴影,高光效果
- 【cocos2d-x 初级教程之四 2.x版本】cocos2d-x如何发射子弹
- STL容器中放入wchar_t*指针出错 Vector中放入wchar_t*
- windows 8 游戏(Xbox Game)
- 其实。讲道理和放闷屁是一回事 - http://my.oschina.net/luckystar/blog/66043
- Implement the quicksort algorithm in as many different ways as possible
- 基于信号量的线程同步
- Windows 8 文件资源管理器(推荐)
- hadoop的文件系统一致模型
- windows 8 文件冲突界面改进
- windows 8 预览界面改进