c++写dll,用了vector,不能写extern c了

如题所述

可以把,,,试着把vector封装到类里面, dll中动态导出类的同时就可以调用vector了

常规是变量\函数\类对象,,,have a try ..
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-08-17
在一个mfc扩展动态库导出函数返回了map变量 ,在exe使用该变量会导致崩溃。如果直接调用该变量不通过函数也一样。不要在动态库接口中传递STL容器!!VC的STL版本,编译选项也是一样的。针对Vector引用的传递没有问题,但是Map就出现问题了。vc6下、通过“一个exe/dll中的指针”指向或者引用“另一个exe/dll中的、包含stl的类”时、这个包含stl的类在析构时就可能出现这样的问题。
1、微软的解释:
大部分C++标准库里提供的类直接或间接地使用了静态变量。由于这些类是通过模板扩展而来的,因此每个可执行映像(通常是. dll或.exe文件)就会存在一份只属于自己的、给定类的静态数据成员。当一个需要访问这些静态成员的类方法执行时,它使用的是“这个方法的代码当前所 在的那份可执行映像”里的静态成员变量。由于两份可执行映像各自的静态数据成员并未同步,这个行为就可能导致访问违例,或者数据看起来似乎丢失或被破坏 了。
可能不太好懂,我举个例子:假如类A有个静态变量m_s,那么当1.exe使用了2.dll中提供的某个A对象时,由于模板扩展机制,1.exe和2.dll中会分别存在自己的一份类静态变量A.m_s。
这 样,假如1.exe中从2.dll中取得了一个的类A的实例对象a,那么当在1.exe中直接访问a.m_s时,其实访问的是 1.exe中的对应拷贝(正确情况应该是访问了2.dll中的a.m_s)。这样就可能导致非法访问、应当改变的数据没有改变、不应改变的数据被错误地更 改等异常情形。
邮件列表里的Conrad Weyns这样认为(意译,就不一句句对应了):
每个.dll或.exe文档可以看作一个执行单元。而由于stl的特 性,每个执行单元中可能会有一个自己的内存分配器(通俗点说,就是堆内存管理器,或者内存池)。当跨越执行单元调用构造/析构函数时,如果这两个调用所在 的执行单元不同,就可能出现通过A的堆管理器去释放B的堆管理器所分配的对象的问题。这就导致了RtlValidateHeap抛出异常。
他所认为的正确解决办法是:使用各种措施,保证程序中只用了一个堆管理器;或者使用智能型的堆管理器(作者建议使用SmartHeap)。
1、保证资源的分配/删除操作对等并处于同一个执行单元;
比如,可以把这些操作(包括构造/析构函数、某些容器自动扩容{这个需要特别注意}时的内存再分配等)隐藏到接口函数里面。换句话说:尽量不要直接从dll中输出stl对象;如果一定要输出,给它加上一层包装,然后输出这个包装接口而不是原始接口。
2、保证所有的执行单元使用同样版本的STL运行库。
比如,全部使用release库或debug库,否则两个执行单元扩展出来的STL类的内存布局就可能会不一样本回答被网友采纳

c++写dll,用了vector,不能写extern c了
可以把,,,试着把vector封装到类里面, dll中动态导出类的同时就可以调用vector了 常规是变量\\函数\\类对象,,,have a try ..

C++里用vector作为函数参数引用就不行了,具体代码如下,会报错:
using namespace std;要放在头文件下哟~换句话说 要放在int count(vector<int> &il);前面 或者所有std相关的 加上std::,如std::cout

C++ 在类定义中 为什么不可以把 vector< vector <int> > vec 写为sta...
vector<vector<int>> a::vec; \/\/ 必须要加上定义.楼上的之所以没有错误是因为他的代码中没有使用vec这个变量, 对于没有使用的变量连接器会忽略它, 所以即使不定义也没有关系, 但是只要用到了就会出现错误..

C++之父在C++程序设计语言一书上写了一个分配器,但是我有点疑惑的就是...
iterator 是一种编程模式,目的是避免成员变量的直接访问。每一个容器都有自己对应的iterator,而每个的实现都需要与其容器对应,无法共用。至于你说的断开的问题,这是事实。所以在每次使用是,都需要重新获取。举个例子,遍历vector是每次都要vector<X>::iterator it...而不能保存一个it来访问 ...

C++中vector使用不当出现的错误
vector内部有一个指向分配了的内存的指针 你copy过去造成多个vector指向堆上同一块内存 这样在析构的时候就会对同一块内存释放两次 出错是在所难免的 STL容器的使用原则之一就是:不要使用CopyMemory,memcpy之类的函数来作无差别拷贝,毕竟容器不是单纯的C结构体 ...

C++,大佬们看下这里报错是为什么?可是这代码能AC啊?!
define 是 C++ 当中非常强大的功能,它可以定义规则对代码进行替换。熟练使用 define 同样可以大大简化编码。但是要注意,凡事不能过度,如果 define 使用过多会影响程序的可读性,也可能对其他人的编码造成影响。所以很多大公司是禁止使用 define 的,我个人倒觉得其实也不用这么严肃,define 可以用,遵守...

C++定义一个类,类的对象是vector,vector的元素是数组,用C++该怎么表示...
你可以写出vector<int[10]> vec这样的定义,这在大部分编译器下都是可以通过编译的,但没有任何用处。因为数组不支持=赋值操作符,在push_back的时候会有问题。用vector<vector<int>>应该很容易达到你要的效果。如果非要用数组的话,折中的方法我想到的有两种:1. 使用vector<int*> vec这样的定义,...

c++在一个类里面定义了一个Vector要素,怎么实现Vector的clear和push...
Vector(double _a,double _b,double _c):a(_a),b(_b),c(_c){} 这是初始化带参构造函数的简写方式,你也可以这样子写(两者是等价的) Vector::Vector(double _a,double _b,double _c){ a = _a; b = _b; c = _c} 但推荐简写的模式(学名叫成员初始化列表),当你这个类是...

C\/C++ 实现链表是用vector还是指针比较好
链表肯定是指针更好 vector更类似于数组 用来做链表 很差的 链表的标准实现 就是指针的。

求C++算法,最好使用vector容器,及sort函数
一般用的都是快速排序,最好、正常和平均时间复杂度都为O(nlog2n),2为底的对数,最坏情况就是数据已经或者近乎有序,当然就是O(n^2)了

相似回答