问题我已经发过,没过多久就沉了,我迫不得已再发一遍,直到大神出现。
我不明白为什么会无法vector解引用。难道是因为我自定义的迭代器有问题吗?
这里附上迭代器定义以及实现代码(截取片段):
1 class DLL_LEAPS_API const_iterator 2 { 3 private: 4 CLeap* _pNow; 5 public: 6 const_iterator(CLeap *p = nullptr):_pNow(p){} 7 const_iterator& operator=(CLeap *p){ _pNow=p; return *this;} 8 const const_iterator operator++(); 9 const const_iterator operator++(int); 10 11 const CLeap& operator*()const; 12 CLeap& operator*(); 13 14 bool operator==(const const_iterator& iter)const; 15 bool operator!=(const const_iterator& iter)const; 16 17 }; 18 //自定义迭代器 19 typedef const_iterator iterator;
其中标准的begin()和end()函数定义在迭代器的容器类CLeaps中,实现代码:
1 CLeaps::iterator CLeaps::begin() 2 { 3 return static_cast<iterator>(&(*(leaps.begin()))); 4 } 5 CLeaps::iterator CLeaps::end() 6 { 7 return static_cast<iterator>(&(*(leaps.end()))); 8 }
再次附上测试代码:
1 #include "DLL_Leaps.h" 2 3 int _tmain(int argc, _TCHAR* argv[]) 4 { 5 CLeaps myleaps; 6 myleaps.setfile("data.dat"); 7 //初始化一个leap 8 CLeap myleap0(string("do activity_0").c_str(),time(nullptr),false); 9 CLeap myleap1(string("do activity_1").c_str(),time(nullptr),false); 10 CLeap myleap2(string("do activity_2").c_str(),time(nullptr),false); 11 myleaps.append(myleap0); 12 myleaps.append(myleap1); 13 myleaps.append(myleap2); 14 cout<<std::setiosflags(ios::left) 15 <<setw(20)<<"reason" 16 <<setw(20)<<"time" 17 <<setw(20)<<"execute_state" 18 <<endl; 19 20 for(auto obj: myleaps ) 21 { 22 leapRecord r=obj.enquireRecord(); 23 char t[255]; 24 ctime_s(t,255,&r.time); 25 cout<<std::setiosflags(ios::left) 26 <<setw(20)<<r.reason 27 <<setw(20)<<t 28 <<setw(20)<<r.executed 29 <<endl; 30 } 31 32 bool res=myleaps.save(); 33 if (!res) cout<<"save fail!"<<endl; 34 else cout<<"save sucessed!"<<endl; 35 36 system("pause"); 37 return 0; 38 }
执行到20行就报错,逐步执行发现是执行到了end()函数,里面有*(vector::iterator),就是这里解引用失败。
完全搞不清什么状况。
求救,我的这个问题搁浅快半个月了,无人问津。
豆子都压出去了,实在没有可以悬赏的了,跪求大神。
换c语言试试
模板都是引用不了的, 具体原因百度, 传指针就ok了
问题的根源在于windows的内存管理是模块独立的, dll分配的内存不可以在exe中释放, 反过来也一样
解决方法可以用全lib方式编译到一个模块
或者牵涉内存分配的另外做接口, 或者用回调方式