首页 新闻 赞助 找找看

C++ 使用自定义动态链接库的错误vector无法解引用!

0
悬赏园豆:20 [待解决问题]

问题我已经发过,没过多久就沉了,我迫不得已再发一遍,直到大神出现。

原问题链接

我不明白为什么会无法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++
TearsOfDawn的主页 TearsOfDawn | 初学一级 | 园豆:34
提问于:2018-06-18 10:06
< >
分享
所有回答(3)
0

换c语言试试

happyZYM | 园豆:248 (菜鸟二级) | 2018-08-28 21:36
0

模板都是引用不了的, 具体原因百度, 传指针就ok了

boveyyun | 园豆:217 (菜鸟二级) | 2018-09-06 18:25
0

问题的根源在于windows的内存管理是模块独立的, dll分配的内存不可以在exe中释放, 反过来也一样
解决方法可以用全lib方式编译到一个模块
或者牵涉内存分配的另外做接口, 或者用回调方式

Yofoo | 园豆:392 (菜鸟二级) | 2020-11-06 17:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册