请问在剪贴板操作中,如何才能将自定义结构中的指针正确复制呢?
使用传统的剪贴板操作
copy 如下:
// 先分配一块内存
MyCBStruct *pData = new MyCBStruct();
hMem = GlobalAlloc(GHND, sizeof(MyCBStruct));
memcpy(GlobalLock(hMem), (void*)pTmpData, sizeof(MyCBStruct));
OpenClipboard
EmptyClipboard();
SetClipboardData
GlobalUnlock(hMem);
CloseClipboard();
// 将开始分配的内存释放
delete pData;
paste 如下:
// 先分配一块内存
MyCBStruct *pData = new MyCBStruct();
OpenClipboard()
GetClipboardData
memcpy(pData, GlobalLock(hMem), sizeof(MyCBStruct));
GlobalUnlock(hMem);
CloseClipboard();
// 将开始分配的内存释放
delete pData;
现在的问题是:如果我定义的结构 MyCBStruct 中没有指针的话,运行良好
但是,如果我的结构中有指针,而且该指针在构造函数中分配内存,在析构函数中释放内存的话,上面的程序就会出现错误。。。
原因是全局内存 hMem 中保存的是一个指针,其内容和 pData 的一样。
非指针变量在 memcpy 中执行了复制,但是指针变量仅仅把指针的地址进行了复制 (是不是就是常说的浅拷贝),所以当我 delete pData;以后,全局内存 hMem 中的指针也就变成“野”指针了。
如果我不进行 delete pData 的话就会造成内存泄露。
有没有什么办法来解决呢?
我现在认为不应该使用 memcpy,而是应该使用一个能执行深拷贝的复制过程函数。
高手指教,谢谢!
问题点数:88、回复次数:3Top
1 楼Mackz(在相互)回复于 2006-03-15 16:56:10 得分 88
拷贝的时候应该把成员指针中的数据一起拷贝,并且修改成员指针的值指向新的数据。一般可以提供一个成员函数完成这个功能,类似序列化。Top
2 楼lglabc(会飞的熊猫)回复于 2006-03-15 17:08:11 得分 0
我也正在这样做,
分配全局内存
GlobalAlloc(GHND, sizeof(MyCBStruct));
然后我进行强制转换
(MyCBStruct*)GlobalLock(hMem);
最后我把指针数据逐个复制,问题在于我使用了 stl
std::list<DWORD> m_listDW
转换过来的指针无法对 m_listDW 进行操作,观察显示,该链表好像没有初始化。。
其他简单的指针已经没有问题了。。
谢!
Top
3 楼lglabc(会飞的熊猫)回复于 2006-03-16 09:20:49 得分 0
ok
已经解决了
使用placement new就可以了,虽然很麻烦。。
结帐Top




