我仍然是新stl成员的新手。谁能指出为什么这段代码会出现分段错误?
#include<memory>
#include<stdio.h>
#include<map>
#include<set>
#include<string>
using namespace std;
struct StubClass
{
weak_ptr<string> b;
int c;
friend bool operator==(StubClass x,StubClass y);
friend bool operator<(StubClass x,StubClass y);
StubClass(weak_ptr<string> x):b(x){c=5;}
};
bool operator==(StubClass d,StubClass c) { return d.b==c.b;}
bool operator<(StubClass d,StubClass c) { return d.b<c.b; }
int main()
{
shared_ptr<string> spPtr(new string("Hello"));
weak_ptr<string> wpPtr(spPtr);
StubClass hello(wpPtr);
set<StubClass> helloSet;
helloSet.insert(hello);
if(helloSet.find(StubClass(wpPtr))!=helloSet.end()) printf("YAYA");
else puts("Bye");
}
错误在行
if(helloSet.find(StubClass(wpPtr))!=helloSet.end()) printf("YAYA");
更多研究表明,调用 StubClass 的比较器函数时存在问题。我在这里编译程序
编辑:
bool operator==(StubClass d,StubClass c) { return d.b.lock()==c.b.lock();}
bool operator<(StubClass d,StubClass c) { return d.b.lock()<c.b.lock(); }
这解决了这个问题。我应该阅读更多内容。:(无论如何,社区中的任何人都可以解释第一个代码给出 SIGSEGV 的原因。我最终想通了,但仍然是一个很好的解释不会受到伤害。:)