为什么可以导出std::string

zrdongjiao 2012-11-05 08:50:42
为什么可以导出std::string
dll:

string getstring()
{
return string("hello");

}


我记得windwos dll规定:导出一个类,那么其父类,父类的父类,像滚雪球一样,全部得导出。

虽然这个函数不是导出一个类,但是其用到了string类型, 为什么编译器毫无提示?



2.string是在dll中new的, 但是无论我改成mfc的使用:静态还是动态,或者是使用windows标准库。

程序依然毫无问题,string的释放却是在exe中啊
...全文
452 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zrdongjiao 2012-11-06
  • 打赏
  • 举报
回复
引用 15 楼 taodm 的回复:
当然是你理解错了。你甚至根本不知道他在说什么。 人家是在说的一种确定可用的“规范”方法,你总是在寻找碰巧可用的捷径。
我再次实验,却是我理解错了,不知道昨晚是怎么回事,成功了。 住贴中的string可以导出, 这种说法是错误的, 这里只是使用了类型而已, 包含了头文件,string并没有以库的形式发布源码,所以额可以直接使用。
zrdongjiao 2012-11-06
  • 打赏
  • 举报
回复
引用 16 楼 taodm 的回复:
自己亲自试一下,保证万年的记忆。只是别人说的,你怎么都记不住的。 手懒是学不好编程的。 引用 14 楼 zrdongjiao 的回复:然后给人使用, 是否会问题,代码是一致的,不过代码都用到了new. 每个开发工具对new的实现似乎不一样。比如bcb, 微软的 这种情形,是否又会有问题?
我用vc6的 /MDd 实现代码,用vs2008调用(/MDd) 结果崩溃了。 另外: vc6(/Mdd)进行new/malloc ,vs2008(/mdd)delete/free也是崩溃。 不同工具开发的dll,哪怕是exe,dll都是用/MDd,共享了同一个_crtHeap, 也有可能崩溃。 //////////////////////////////////////////////////////////////////// 再提供一个实验: vc6 /Mdd void CreateStr() { printf("hello"); //crt char buf[100]; memcpy(buf,"hello",5);//crt } vs2008 /mdd 调用 结果并不崩溃 ====>涉及到内存分配,stl等容器, 尽量避免使用。注意版本的对应。
老邓 2012-11-05
  • 打赏
  • 举报
回复
因为你用的是动态CRT。 改用/MT静态链接CRT试试?
子达如何 2012-11-05
  • 打赏
  • 举报
回复
到处STL对象有很多问题的,以std::string 为例,VC的DEBUG版和RELEASE版的内存就不一样,dll是release的,调用者是debug的话,要非法操作的。
yue_wei_ 2012-11-05
  • 打赏
  • 举报
回复
指示一个对象罢了
mujiok2003 2012-11-05
  • 打赏
  • 举报
回复
你并没有导出类std::string。导出类只有在内存布局不兼容的情况下才出问题。
taodm 2012-11-05
  • 打赏
  • 举报
回复
自己亲自试一下,保证万年的记忆。只是别人说的,你怎么都记不住的。 手懒是学不好编程的。
引用 14 楼 zrdongjiao 的回复:
然后给人使用, 是否会问题,代码是一致的,不过代码都用到了new. 每个开发工具对new的实现似乎不一样。比如bcb, 微软的 这种情形,是否又会有问题?
羽飞 2012-11-05
  • 打赏
  • 举报
回复
施主导出的明显就一个对象啊
taodm 2012-11-05
  • 打赏
  • 举报
回复
当然是你理解错了。你甚至根本不知道他在说什么。 人家是在说的一种确定可用的“规范”方法,你总是在寻找碰巧可用的捷径。
zrdongjiao 2012-11-05
  • 打赏
  • 举报
回复
各位大老爷们常说,导出stl的类有各种问题,原因:厂商不一。 那么,我如此举例可否: dll有一个函数,这个函数代码是一样的,内部设计到了内存分配。 有2中开发工具写的, 然后给人使用, 是否会问题,代码是一致的,不过代码都用到了new. 每个开发工具对new的实现似乎不一样。比如bcb, 微软的 这种情形,是否又会有问题?
zrdongjiao 2012-11-05
  • 打赏
  • 举报
回复
引用 10 楼 Loaden 的回复:
不挂不代表没问题。 另外,使用/MT的Release版本测试。不要用Debug版。
实验了2次,只要是release版本呢的 那么: /mt /md 程序都立即崩溃 有个疑问:我在codeproject的看过一篇老外写的文章,谈到了对类的导出,说要以滚雪球的方式 比如 导出一个派生类,那么就必须导出基类,依次下去, 我刚才做了实验: class Base { public: Base(); ~Base(); }; class _declspec(dllexport) Derived:public Base { public: Derived(); ~Derived(); }; 似乎并不需要滚雪球。 难道是我理解错了嘛?
taodm 2012-11-05
  • 打赏
  • 举报
回复
不试过就知道的,还能是惊喜么。
老邓 2012-11-05
  • 打赏
  • 举报
回复
引用 9 楼 taodm 的回复:
你用gcc来调用一下你的这个dll试试呗。会有惊喜的。 虽然,string和vector确实是stl里极少的可以导出的容器,但是这和你的问题无关。
GCC默认使用引用计数,VC不使用。 不知道这个惊喜是什么?
老邓 2012-11-05
  • 打赏
  • 举报
回复
不挂不代表没问题。 另外,使用/MT的Release版本测试。不要用Debug版。
taodm 2012-11-05
  • 打赏
  • 举报
回复
你用gcc来调用一下你的这个dll试试呗。会有惊喜的。 虽然,string和vector确实是stl里极少的可以导出的容器,但是这和你的问题无关。
zrdongjiao 2012-11-05
  • 打赏
  • 举报
回复
人呢 怎么没忍了啊
zrdongjiao 2012-11-05
  • 打赏
  • 举报
回复
人呢 我说版主,我的实验,你测试过?
zrdongjiao 2012-11-05
  • 打赏
  • 举报
回复
引用 5 楼 Loaden 的回复:
因为你用的是动态CRT。 改用/MT静态链接CRT试试?
dll: mfc的使用:静态库中使用mfc crt:/mtd exe: 共享dll使用mfc crt: /mdd 依然不挂。 怎么解释?

64,648

社区成员

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

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