class Test
{
QString BlockName;
QString BlockItemName;
}
QVector<Test *> p_Vector;
void test()
{
Test t;
t.BlockName = hello;
t.BlockItemName = World;
AddTestBlock(t);
}
void AddTestBlock(Test t)
{
Test *p = new Test;
// 此时的 memcpy 会涉及隐式共享,QString 只会进行浅拷贝,真正的字符不会拷贝到 new 出来的空间当中
// 问题:当 test() 当中的局部变量 t 内存释放之后,p_Vector 则无法访问到对应的字符串(因为是浅拷贝,并不会将对应的字符实际拷贝过来)
memcpy(p, &t, sizeof(t));
// 解决方法1:利用对应的接口,取消隐式共享,将字符内存进行深拷贝
Test->BlockName.detach();
Test->BlockItemName.detach();
// 解决方法2:修改某一个字符。(当新增/修改/删除QString当中一个字符的时候,也会触发深拷贝)
Test->BlockName[0] = 'a';
p_Vector.append(p);
}
取消Qstring当中的隐式共享,浅拷贝
最新推荐文章于 2023-08-11 17:38:32 发布