我仍然是新stl成員中的新手。任何人都可以指出爲什麼此代碼給出了分段錯誤?weak_ptr中的比較運算符C++
#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");
}
的錯誤是在管線
如果(helloSet.find(StubClass(wpPtr))= helloSet.end()!)的printf( 「YAYA」);
更多的研究表明,StubClass的比較函數被調用時會出現問題。 我編譯程序here
編輯:
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(); }
這解決了issue.I應閱讀更加:( 不管怎麼說來自社區的任何人都可以解釋爲什麼第一代碼給出SIGSEGV的原因。我想通了最後,但還是一個很好的解釋不會傷害:)
爲了避免將來出現這樣的問題,使用顯式可能會有幫助。 '明確的StubClass(weak_ptr x):b(x){c = 5;}'會馬上顯示出問題。 –