跨模块的问题

u0116snail 2014-11-14 08:07:06
DLL 中,有如下两个函数:
void  GetStr(std::string &str)
{
str = "abcd";
}

string GetStr()
{
return m_str; // m_str :"ABCD"
}


在 EXE 中,我调用这两个接口,却得不到想要的结果。

第一个问题:
为什么在 EXE 中,没有得到 DLL 中返回的 string ? 为什么 没有得到 输出参数的 string ?

第二个问题:
这种跨模块的问题,到底是怎么个实质,什么叫做模块?是根据什么标准,来说它们是不同的模块?

第三个问题:
看到有网友说:“所用的堆不同”(对这句话不懂,尤其是那个“堆”字……求解释)

本人很挫,见识短浅,提问也提不到点子上,开明的您,还请不要笑话,谢谢




...全文
246 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
双杯献酒 2014-12-03
  • 打赏
  • 举报
回复
http://www.cnblogs.com/rickerliang/archive/2011/09/14/2176656.html
双杯献酒 2014-11-15
  • 打赏
  • 举报
回复
你要调用这个函数才能得到它的返回值.
u0116snail 2014-11-15
  • 打赏
  • 举报
回复
引用 1 楼 iicup 的回复:
你要调用这个函数才能得到它的返回值.
看来您也不太懂
u0116snail 2014-11-15
  • 打赏
  • 举报
回复
引用 6 楼 zhousitiaoda 的回复:
我在3楼第三条说了这么多你就只看后面句不看前面么。
我在1楼最后一句不是说了么:我“见识短浅”,浅到只能看到后面的就看不见前面的了……
renwotao2009 2014-11-15
  • 打赏
  • 举报
回复
楼主,你调用后string 结果是什么,或者说string显示什么?
zhousitiaoda 2014-11-15
  • 打赏
  • 举报
回复
我在3楼第三条说了这么多你就只看后面句不看前面么。
zhousitiaoda 2014-11-15
  • 打赏
  • 举报
回复
运行时库才是表象。 “如果E X E和D L L都链接到D L L的C / C + +运行期库,那么上面的代码将能够 很好地运行。但是,如果两个模块中的一个或者两个都链接到静态C / C + +运行期库,那 么对free函数的调用就会失败。”--摘自windows核心编程 为什么静态链接到C/C++运行时库会有问题,因为如果静态链接,DLL会独占一个堆,你在一个堆上malloc,另一个堆上free能不出问题吗?
u0116snail 2014-11-15
  • 打赏
  • 举报
回复
引用 3 楼 zhousitiaoda 的回复:
另外如果DLL,exe使用不同编译器或者编译器版本不一致,或者一个debug一个release都有可能导致跨模块释放内存崩溃。
表象确实是这样,那实质是什么呢? (据我所知,实质是运行时库的原因,不过我知其然却不知其所依然)
zhousitiaoda 2014-11-15
  • 打赏
  • 举报
回复
1:这个问题太抽象,就好像问为什么昨天吃了饭今天没拉屎一样。 2:官方定义没找到,就我经验来看,DLL,exe都是模块 3:进程有且仅有一个默认全局堆,DLL有可能使用的也是这个全局堆,但也有可能使用一个私有的堆(比如DLL选择静态链接),如果你在DLL里有申请内存,然后在exe里释放,那是绝对不行的。比如GetStr这个函数,在DLL里就有内存分配的动作,在exe里变量析构就会释放内存。另外如果DLL,exe使用不同编译器或者编译器版本不一致,或者一个debug一个release都有可能导致跨模块释放内存崩溃。

65,187

社区成员

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

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