`
zealotds
  • 浏览: 121979 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

一个STL对象的DLL边界传递问题

阅读更多
c++, DLL, std::string, STL, crt

这里有非常详细的一篇讨论仅供参考
也有可能是一个已知的微软实现问题

最近在重构项目时遇到的一个问题:提取了原来项目中的一些公共方法到一个新的DLL,暴露的工具方法中多数以const std::string& 为参数。在调试时发现当主程序(exe)调用DLL中的这些工具方法时传入的string会发生莫名其妙的变化(不是encoding问题)。比如在主程序中的string的buffer地址为0x0118cd8,可是刚刚进入工具方法(const std::string&)这个string的内容就变了,而且buffer地址也发生了变化,根据观察只有几个字节的偏移。开发环境为VC2008。

排除过程
首先检查了C++的Runtime library,确定都是/MD,另外调整了两个工程的其它编译,连接选项到一致,问题依旧。最后在编译命令行中(Command Line)发现了一个可疑点,_DEBUG预编译项。可是我明明用的是/MD(Multithreaded DLL),不是/MDd(debug),为什么会有_DEBUG呢?为了验证猜测,使用“Undefine Preprocessor Definitions”取消了_DEBUG定义,问题解决!
其实问题的根源在于我这个调试用的Build Configuration,是基于默认的Debug创建的,这样,VS或默认为你加上_DEBUG定义,而我们这个项目原来的工程的debug环境都是基于Release配置创建的build configuration。其实不仅是string,STL中的很多类型(不敢说全部)都存在这样的问题。

总结
1. 为了保证程序行为的一致性,DLL与主程序的runtime library最好完全一致,否则便可能引入各种链接和运行时错误。
2. DLL的接口方法好暴露C式的方法签名,这样一方面可以提高LIB的可用性,还能杜绝STL对象的这种问题。
3. 错误的排除可以从编译器和链接器的的command line参数入手
4. 在为项目添加新的工程时尤其需要注意
0
0
分享到:
评论

相关推荐

    c++ stl线程安全

    在DLL之间传递STL对象时,必须确保所有涉及的线程都在同一作用域内,并且对容器的修改都在正确的上下文中进行。如果一个DLL在修改容器时,另一个DLL也在尝试访问它,那么可能会发生访问冲突。 另外两个文件名涉及了...

    STL解决排队问题

    STL解决排队问题STL解决排队问题STL解决排队问题STL解决排队问题STL解决排队问题

    WtOPCSvr.dll

    DLL中传递STL参数,vector对象作为dll参数传递等问题 假如类A有个静态变量m_s,那么当1.exe使用了2.dll中提供的某个A对象时,由于模板扩展机制,1.exe和2.dll中会分别存在自己的一份类静态变量A<int>.m_s。 这样,...

    STL入门 STL入门 STL入门 STL入门 STL入门 STL入门

    STL的出现是计算机科学抽象能力发展的一个里程碑,它引入了泛型编程的概念,允许程序员编写不依赖于具体数据类型的代码,从而实现更高的复用性和灵活性。 在STL中,有六个关键的组件: 1. **迭代器(Iterator)**:...

    stl文件在matlab中的读取.zip_matlab 点云stl_matlab与STL文件_matlab读取stl_stl点云

    首先,创建一个patch对象,然后设置其颜色、透明度等属性,最后使用`view`函数调整视角: ```matlab % 创建patch对象 hPatch = patch('Vertices', vertices, 'Faces', faces, 'FaceColor', 'red', 'EdgeColor', '...

    手工制作一个STL文件

    在“手工制作一个STL文件”的过程中,我们需要深入了解STL文件的基本结构和三角形面片的数据表示。 STL文件格式的基础是通过一系列相互连接的三角形面片来构建3D模型。每个三角形面片由三个顶点组成,这些顶点在三...

    stl.rar_STL_STL源码下载_stl 源码_stl源码_visual c

    例如,`std::vector`是一个动态数组,提供高效随机访问;`std::list`是双向链表,适用于频繁的插入和删除操作;`std::set`是红黑树实现的集合,保证元素唯一性。 2. 迭代器:迭代器是STL中连接容器和算法的关键概念...

    STL中文手册 doc文档

    STL(Standard Template Library,标准模板库)是C++编程语言中的一个重要组成部分,它提供了一系列高效、可重用的数据结构和算法。这个“STL中文手册 doc文档”显然是为了解决C++程序员在使用STL时遇到的问题,帮助...

    matlab 转stl格式文件

    这个函数接受两个主要参数:一个是包含顶点和面片信息的三维网格对象,另一个是输出的STL文件名。例如,如果你有一个名为`myMesh`的三维网格对象,你可以使用以下命令将其转换为STL文件: ```matlab stlwrite('...

    stlshow_stl分层_STL分层_stlmatlab_STL切片_stl分层

    `stlread.m`可能是一个读取STL文件的MATLAB函数,而`ui.m`可能包含用户界面元素,用于交互式设定分层参数。 在MATLAB中,STL文件的读取通常涉及以下步骤: 1. 使用`stlread`函数:MATLAB社区或者自定义的`stlread.m...

    【c++ Stl教程】stl使用及stl编程

    C++ STL(Standard Template Library,标准模板库)是C++编程中的一个重要组成部分,它提供了一系列高效、可重用的数据结构和算法。STL的核心概念包括容器(Containers)、迭代器(Iterators)、算法(Algorithms)...

    XP atl80.dll

    Atl80.dll是微软Windows操作系统中的一个动态链接库(Dynamic Link Library)文件,主要用于支持Active Template Library (ATL)的版本8.0。ATL是一个轻量级的C++库,由微软开发,用于简化COM(Component Object ...

    STL文件的读取显示.zip_STL c++_STL文件_STL读取_读取stl_读取stl文件

    每个STL文件包含一个头信息和一系列的三角形面片描述。头信息通常为“solid”开头,然后是一些描述性的文字,接着是三角形面片的数据。 读取STL文件的过程通常包括以下步骤: 1. 打开文件:使用C++的fstream库打开...

    18个STL程序带你逐步了解STL

    STL是一个包含容器、迭代器、算法和函数对象的库,它通过模板类和函数模板实现了泛型编程。它的核心思想是分离接口和实现,使得程序员可以专注于问题的逻辑,而不是底层数据结构和算法的细节。 2. **容器**: - *...

    C++ STL程序员面试题

    - 举例说明如何自定义一个函数对象,并在STL算法中使用。 - 描述STL容器的内存管理和效率特点,比如vector的连续存储和list的跳跃访问。 4. **STL.doc** 另一份全面的STL文档可能详细解释了各个组件的内部工作...

    effective stl 中文 pdf

    《Effective STL》是一本专注于C++标准模板库(STL)使用的指南书籍,由Scott Meyers撰写。书中详细讲解了如何有效地使用STL中的容器、迭代器、算法和函数对象,以及如何避免常见的陷阱和误区。本书针对的读者是已经...

    Effective STL Effective STL Effective STL

    STL是C++库中的一个核心部分,它提供了容器(如vector、list、set等)、迭代器、算法和函数对象,极大地增强了C++的泛型编程能力。这本书主要关注如何通过理解和应用一些关键原则来避免陷阱,提高代码的效率和可维护...

    STL.zip_java读取stl_stl读取 java

    1. **打开文件**:使用`java.io.File`类创建一个File对象,然后通过`java.nio.file.Files`类的`newBufferedReader`方法创建一个BufferedReader,以读取文件内容。 2. **解析文件**:逐行读取文件,跳过头信息,直到...

Global site tag (gtag.js) - Google Analytics