带有CString变量的结构体,如何进行深拷贝配置

guzi19801130 2021-06-25 09:19:21

struct ModelFile {
     CString  SimpleName;
     CString   SupportPathFile ;
     CString  ModelPathFile  ;

}

结构体如上,在进行vector<ModelFile> ModelFileSet;的求取运算时,需要用到容器vector的push_back运算,此时直接进行运算时,会出现同一地址变量析构,出现abort()错误,因此需要对此结构体进行深拷贝重构。

不明白如何对CString变量的结构体进行深拷贝重构,哪位大侠肯指教一下!!

...全文
1093 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
guzi19801130 2021-06-26
  • 打赏
  • 举报
回复

现在问题解决了,但出现问题的原因还是不明白,先总结一下吧。

     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运算,就不会出错了

   但是出错的具体原理,我还是不明白

 

江水2018 2021-06-26
  • 打赏
  • 举报
回复 1
你的结构体没有深拷贝的问题。应该是其他问题导致的。 你试试不要new那个结构体,然后直接搞个对象,push进去试试,应该出同样的问题。 你还可以用vector 的[]赋值进去试试。先resize出几个,然后赋值。
guzi19801130 2021-06-26
  • 举报
回复
@江水2018 嗯嗯 谢谢!
_mervyn 2021-06-25
  • 打赏
  • 举报
回复 1

你多虑了。 CString之间的赋值操作不会出问题的,你不需要担心深拷贝问题
至于你的struct ModelFile 如果成员只有CString,那你也不需要特意写拷贝构造函数和operator=
因为默认的实现就是调用其所有成员的实现,也就是会调用你所有CString成员的拷贝构造或赋值操作。
而CString是你不需要关心的,所以ModelFile也不需要担心。

你的问题应该不在这里。 注释掉push_back 难道就不会出错了吗?
你可能是调用了 CString的GetBuffer() 或者 把某个CString强转成了char*,然后你却修改了这个char*的内容引起的问题。 

guzi19801130 2021-06-25
  • 举报
回复
@_mervyn 好的好的 我仔细看看
yiyefangzhou24 2021-06-25
  • 打赏
  • 举报
回复

pModelFile->ModelPathFile = CPublic::ModelPathFileSet[i];这句应该是浅拷贝吧,改成cstring.Format试试?

总体讲这样写还是比较危险的,一定要这么写?

guzi19801130 2021-06-25
  • 举报
回复
@yiyefangzhou24 试了 不是这个地方的问题, 不是CString深拷贝的问题,是结构体ModelFile 深拷贝的问题
yiyefangzhou24 2021-06-25
  • 打赏
  • 举报
回复

应该是CPublic::ModelFileSet.push_back( pModelFile    );吧?

guzi19801130 2021-06-25
  • 举报
回复
@yiyefangzhou24 我调试过的 没问题的 现在的问题估计就是 结构体ModelFile的深拷贝问题
guzi19801130 2021-06-25
  • 打赏
  • 举报
回复

CPublic::ModelFileSet 的初始化

guzi19801130 2021-06-25
  • 打赏
  • 举报
回复

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越界”

guzi19801130 2021-06-25
  • 举报
回复
@真相重于对错 i=0时,第一个pushback就出错啊 ,我觉得是结构体ModelFile没有深拷贝的原因
真相重于对错 2021-06-25
  • 举报
回复
@guzi19801130 CPublic::ModelFileSet 怎么初始化的?
guzi19801130 2021-06-25
  • 举报
回复
@真相重于对错 vector&lt;ModelFile&gt; CPublic::ModelFileSet;
4条回复
真相重于对错 2021-06-25
  • 打赏
  • 举报
回复

贴全你的代码,或者至少贴出最小能反映你错误的代码,CString 自带拷贝构造函数和operator=,操作CString不会出现深拷贝错误,只有操作CString*或者CString&才可能出现错误

guzi19801130 2021-06-25
  • 打赏
  • 举报
回复

程序已经做了好多了,现在是添加程序的一个小功能,需要用到带CString变量的结构体的深拷贝

yiyefangzhou24 2021-06-25
  • 打赏
  • 举报
回复
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); }
};

MFC中CString实现原理简单介绍_土戈的博客-CSDN博客_cstring源码

guzi19801130 2021-06-25
  • 举报
回复
@yiyefangzhou24 好的好的 我仔细看看
yiyefangzhou24 2021-06-25
  • 打赏
  • 举报
回复

cstring是mfc的类,如果你哟女vector建议用std::string做结构体变量

guzi19801130 2021-06-25
  • 打赏
  • 举报
回复

自己顶一下,谢谢

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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