把map传进DLL中,为何不能使用itor++?

bdove 2007-04-04 10:36:19
TMap::iterator itor = NULL;
for(itor = pMap->begin(); itor != pMap->end(); )
{
char* pData = itor->second;
int a = itor->first;

itor++;
}

用find查找的数据能正常使用,查看map中的数据,正常。
而且把dll中生成的map传出,在DLL外能正常使用itor++!

谁能帮忙解决在DLL内部,不能itor++问题?
...全文
403 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
neil_cn 2007-04-05
  • 打赏
  • 举报
回复
建议你查看一下其他相关的代码,顺便问一下,你怎么传的 Map ? 能不能把你的 dll 声明和调用 DLL 的那句贴出来看看?(不过我也试过了不同的调用约定,都没有问题)
neil_cn 2007-04-05
  • 打赏
  • 举报
回复
我才试了一下,一切正常,没有问题。。。
palmax 2007-04-05
  • 打赏
  • 举报
回复
你把
char* pData = itor->second;
int a = itor->first;
这两行注释掉是否也报错呢?

我觉得还是用指针是有问题的
neil_cn 2007-04-05
  • 打赏
  • 举报
回复
哦。。。我测试的时候的DLL里面没有用类

建议看下 jiangsheng(蒋晟.Net[MVP]) 发的链接

http://support.microsoft.com/kb/172396
http://support.microsoft.com/kb/168958
bdove 2007-04-05
  • 打赏
  • 举报
回复
因为发现用map传到动态库出问题,单独测试,也一样。以上是单独测试的全部代码.
bdove 2007-04-05
  • 打赏
  • 举报
回复
neil_cn(Neil)
DLL代码:
.h
#ifdef TESTMAP_EXPORTS
#define TESTMAP_API __declspec(dllexport)
#else
#define TESTMAP_API __declspec(dllimport)
#endif
#include <map>
#include <list>
using namespace std;
typedef map<int, char*> TMap;
typedef list<char*> TList;


// This class is exported from the TestMap.dll
class TESTMAP_API CTestMap {
public:
CTestMap(void);
void Init(TMap* pMap);
// TODO: add your methods here.
};

.cpp

void CTestMap::Init(TMap* pMap)
{
TMap::iterator itor = NULL;
for(itor = pMap->begin(); itor != pMap->end(); ++itor)
{
char* pData = itor->second;
int a = itor->first;

;
}
}

EXE

#include "stdafx.h"
#include "../TestMap/TestMap.h"
#pragma comment(lib, "../TestMap/debug/TestMap.lib")


int main(int argc, char* argv[])
{
TMap* pmap = new TMap;
char *pValue1 = new char[2];
pValue1[0] = 65;
char *pValue2 = new char[2];
pValue2[0] = 66;
pmap->insert(TMap::value_type(1, pValue1));
pmap->insert(TMap::value_type(2, pValue2));
CTestMap cmap;
cmap.Init(pmap);
return 0;
}

palmax 2007-04-05
  • 打赏
  • 举报
回复
再多贴些代码吧,现在我只能靠猜
bdove 2007-04-05
  • 打赏
  • 举报
回复
palmax(准备学习PHP)
就是在不加的情况下,出的错,加上,只是为了看看取出的数据对不对!
蒋晟 2007-04-05
  • 打赏
  • 举报
回复
You may experience an access violation when you access an STL object through a pointer or reference in a different DLL or EXE

http://support.microsoft.com/kb/172396

How to export an instantiation of a Standard Template Library (STL) class and a class that contains a data member that is an STL object

http://support.microsoft.com/kb/168958
palmax 2007-04-04
  • 打赏
  • 举报
回复
估计不是itor++的问题,而是你用局部变量和指针有些地方没注意,造成内存访问违规的情况
还有循环一般都是怎么写的:
for ( TMap::iterator it = mMap.begin(); it != mMap.end(); ++it )
东文-桑晨 2007-04-04
  • 打赏
  • 举报
回复
itor++使用之后报什么错?
Alan S1 2007-04-04
  • 打赏
  • 举报
回复
up
bdove 2007-04-04
  • 打赏
  • 举报
回复
roger_77(阿生)(……)
从DLL导出的指针对象是可以直接读取的。
但传入到DLL中,就不能用迭代器了!
但奇怪的是,如果是用find查找key得到的迭代器,是没有问题的!
此外,试过vect和list,他们都可以传入到DLL中,用迭代器操作
bdove 2007-04-04
  • 打赏
  • 举报
回复
palmax(准备学习PHP)
你没明白我的意思,itor++跟++itor在目前这个错误的情况下,没什么区别。而从位置上来言,把itor++放到循环里,更灵活。
roger_77 2007-04-04
  • 打赏
  • 举报
回复
0xC0000005: Access Violation
非法的地址访问。

因为是跨DLL的地址访问,STL的容器最好不要引出,
跨DLL最好能按值传参,而不要传地址。
palmax 2007-04-04
  • 打赏
  • 举报
回复
我不说什么了
明明用 ++itor 效率更高,楼主还要说没有区别
bdove 2007-04-04
  • 打赏
  • 举报
回复
itor++报错误为:
Unhandled exception in TestTest.exe(TESTMAP.DLL):0xC0000005: Access Violation.
bdove 2007-04-04
  • 打赏
  • 举报
回复
调试时,在DLL中,通过展开map,可以看到各个结点的值,一切正常,用find操作,也没有任何问题,但是用迭代器从第一个结点开始取,在itor++时,出问题。
for ( TMap::iterator it = mMap.begin(); it != mMap.end(); ++it )

for(itor = pMap->begin(); itor != pMap->end(); )
{
itor++;
}
没有区别的,用下面的方法,更灵活点!
CathySun118 2007-04-04
  • 打赏
  • 举报
回复
什么错误?是不是字节对齐的问题?
homejiji 2007-04-04
  • 打赏
  • 举报
回复
支持楼上的

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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