关于结构体用内存复制memcpy后的释放问题 主程序和dll使用一个同一结构的结构体作为传递参数,因为结构体内的参数很多,在Dll内用了memcpy,当dll内处理完数据返回后,主程序再关闭时就报错了,跟踪之下发现是主程序在退出时尝试去释放传给dll的那个结构体,结果挂了,有什么办法指定一方释放,或者让主程序不去释放? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你的结构是怎么分配的。用GlobalAlloc来分配,用GlobalFree来释放 没有分配,dll接收到后是直接copy的extern "C" _declspec(dllexport)int McAp(BookMark book){ AFX_MANAGE_STATE(AfxGetStaticModuleState()); BookMark bookbackup; memcpy(&bookbackup,&book,sizeof(book)); theApp.CallDlg(); return 1;} 因为如果你的结构里有指针,你的指针是不可以通过memcpy来赋值的。 估计你的BookMark结构体里有指针,所以做副本memcpy时把主程序的结构体指针地址拷过去了,结果DLL内运行完在退出函数时跨模块释放了不是自己的那部分内存,导致出错了. 结构里头有个容器vector,现在看来是这个引起的,除了一个个赋值还有没有什么便捷的方法可以把整个内容复制一份,里面内容太多了。 如果你的任何一个结构体成员都可以使用operator=赋值(vector当然也是),那么你的结构体也将拥有默认的operator=函数,可以直接使用=号赋值。 关于文件流写人utf-8编码格式的问题(帮顶有分) 高手进来看 帮帮忙,如何嵌入一个exe文件的问题. WSAGetLastError(),错误代码为10048 谢!! CAsyncSocket问题,高手请进! 怎么恢复已被删除地菜单?急! 请教一个有关UNICODE的问题 &&&&&&&诚招C++程序员,专职兼职均可,公司地址:重庆南坪经济技术开发区,待遇从优,名额有限,请致电62901296,周先生联系,或e-mail:zxy85@sin 是否一个线程 就拥有一个消息循环!! 这段代码有什么错误? 关于mfc中的编辑框 怎样为对话框和控件添加图片??
没有分配,dll接收到后是直接copy的
extern "C" _declspec(dllexport)
int McAp(BookMark book)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()); BookMark bookbackup;
memcpy(&bookbackup,&book,sizeof(book));
theApp.CallDlg();
return 1;
}
因为如果你的结构里有指针,你的指针是不可以通过memcpy来赋值的。
结果DLL内运行完在退出函数时跨模块释放了不是自己的那部分内存,导致出错了.
如果你的任何一个结构体成员都可以使用operator=赋值(vector当然也是),那么你的结构体也将拥有默认的operator=函数,可以直接使用=号赋值。