65,211
社区成员
发帖
与我相关
我的任务
分享struct ModelFile {
CString SimpleName;
CString SupportPathFile ;
CString ModelPathFile ;
}
结构体如上,在进行vector<ModelFile> ModelFileSet;的求取运算时,需要用到容器vector的push_back运算,此时直接进行运算时,会出现同一地址变量析构,出现abort()错误,因此需要对此结构体进行深拷贝重构。
不明白如何对CString变量的结构体进行深拷贝重构,哪位大侠肯指教一下!!
现在问题解决了,但出现问题的原因还是不明白,先总结一下吧。
1、原因及现象: CPublic::ModelFileSet.push_back( *pModelFile );是出现在mfc的.cpp 文件的BOOL InitInstance()函数中,在此函数中,进行带CString变量的结构体ModelFile的vector容器,进行push_back时,就出现vector越界abort报错,
2、解决办法:在mfc的.cpp 文件的BOOL InitInstance()函数的对应位置,发送一个消息sendmessage到view.cpp文件中,之后在消息函数中进行带CString变量的结构体ModelFile的vector容器pushback运算,就不会出错了
但是出错的具体原理,我还是不明白
你多虑了。 CString之间的赋值操作不会出问题的,你不需要担心深拷贝问题
至于你的struct ModelFile 如果成员只有CString,那你也不需要特意写拷贝构造函数和operator=
因为默认的实现就是调用其所有成员的实现,也就是会调用你所有CString成员的拷贝构造或赋值操作。
而CString是你不需要关心的,所以ModelFile也不需要担心。
你的问题应该不在这里。 注释掉push_back 难道就不会出错了吗?
你可能是调用了 CString的GetBuffer() 或者 把某个CString强转成了char*,然后你却修改了这个char*的内容引起的问题。

pModelFile->ModelPathFile = CPublic::ModelPathFileSet[i];这句应该是浅拷贝吧,改成cstring.Format试试?
总体讲这样写还是比较危险的,一定要这么写?
应该是CPublic::ModelFileSet.push_back( pModelFile );吧?


CPublic::ModelFileSet 的初始化
for (unsigned short i = 0; i < CPublic::ModelPathFileSet.size();i++)
{
ModelFile *pModelFile = new ModelFile();
pModelFile->ModelPathFile = CPublic::ModelPathFileSet[i];
pModelFile->SupportPathFile = CPublic::SupportPathFileSet[i];
CPublic::ModelFileSet.push_back( *pModelFile );
delete pModelFile;
}
错误就是出现在pushback那一行,说“vector越界”
贴全你的代码,或者至少贴出最小能反映你错误的代码,CString 自带拷贝构造函数和operator=,操作CString不会出现深拷贝错误,只有操作CString*或者CString&才可能出现错误
程序已经做了好多了,现在是添加程序的一个小功能,需要用到带CString变量的结构体的深拷贝
struct CStringData
{
long nRefs; // reference count
int nDataLength; // length of data (including terminator)
int nAllocLength; // length of allocation
// TCHAR data[nAllocLength]
TCHAR* data() // TCHAR* to managed data
{ return (TCHAR*)(this+1); }
};
cstring是mfc的类,如果你哟女vector建议用std::string做结构体变量
自己顶一下,谢谢