Re: [問題] Clang 奇怪的問題,跟compare functor有關

作者: saladim (殺拉頂)   2014-11-07 10:34:27
※ 引述《saladim (殺拉頂)》之銘言:
http://ideone.com/ET2sJs
以上是我的測試碼
好吧 這個結果更奇怪 連自己寫的comparator都失敗了
請各位先進幫忙指點一下 我本身主要是用clang++寫這個功能
這個網站應該是用gcc.........
謝謝
P.S. 請原諒用摘錄的方式 因為我是用virtualbox跑freebsd
現在才發現 要把檔案弄出virtualBox有點難 這種設定問題搞了我好久 @_@
: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
: FreeBSD 10x
: Clang++ 3.5
: 參數 -Wall (試過 -g, -O1 -O2, 基本上問題都存在或甚至更離譜)
: 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
: 使用 stl_tree.h裡面的 red black tree
: 問題(Question):
: 最近做了一些實驗 主要是想看看能不能使用stl_tree.h裡面的那個rbtree.
: 不過遇到了一個很奇怪的問題
: 主要是當我使用std::less<int> 當作key的比較functor時, 最後結果用inorder
: traversal 或是用rbtree的begin() and end()去循序印出的結果是錯誤的,
: 用gdb進去看發現傳到 std::less<int>::operator()(const int&, const int&)
: 的值並非正確的值(-1077945256).......
: = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
: 節錄程式碼: 我是直接繼承 _Rb_Tree來使用它內部的function, 方便存取內部資料
: MyClass
: {
: public:
: struct Key
: {
: int operator()(const MyClass& class) { return class.getHead();}
: };
: public:
: int getHead() { return head;}
: private:
: .......
: int head;
: .......
: };
: template<typename K,typename V, typename KofV, typenam Comp,
: typename Alloc=std::allocator<V> >
: MyTree:public std::_Rb_tree<K,V,KofV,Comp,Alloc>
: {
: public:
: std::pair<std::_Rb_tree<K,V,KofV,Comp,Alloc>::iterator,bool >
: insert_unique(const value_type& value){this->_M_insert_unique(value);};
: }
: typedef MyTree< int, MyClass, MyClass::Key, std::less<int> > Tree;
: 使用插入:
: Tree tree;
: tree.insert(MyClass(....));
: = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
: 之後我使用inorder traversal 跟 tree.begin() to tree.end() iteration,印出的
: 順序是錯誤的. 可是!!!!!!!! 如果我把比較函數換成另外一個:
: struct MyComp
: {
: bool operator()(int a, int b) { return a < b; }
: }
: 順序就對了, 注意, 紅色標示處一定要是 int, 若是換成const int& 一樣出錯!!!
: 另外 std::less<int> 跟 MyComp單獨使用不管參數型態為何都是正常的......
: 請問有誰遇過這種狀況嗎? 見鬼的奇怪....誰能幫忙試一下g++版本
: 最近FreeBSD gcc port都編譯失敗.....壞一陣子了......
作者: lantw44 (#######################)   2014-11-07 10:36:00
檔案弄出 virtualbox,其實 ssh / sftp 就行?
作者: saladim (殺拉頂)   2014-11-07 10:37:00
我其他地方沒有機器 然後要設定從host連到guest都失敗 XD或許晚點再跟大大順便請教一下host to guest要怎麼設定
作者: legendmtg (CLANNAD)   2014-11-07 12:04:00
你的MyCmp怎麼一直在跟0比?
作者: saladim (殺拉頂)   2014-11-07 12:09:00
不曉得阿 @_@ 這應該就問題所在 我在自己的機器上不會就如之前所PO的 在我的機器上 std::less會有錯 但是自己的MyCmp不會錯(使用Clang++3.5) 但是ideone這個兩個都錯另外 若是不使用額外的那個Node struct,直接用int, 就正常惹 請幫幫忙阿~可能是哪裡寫錯或是觀念錯吧
作者: legendmtg (CLANNAD)   2014-11-07 12:14:00
28行 using後面少了typename看一下RB tree是怎麼呼叫你的compare function的吧我用g++跟clang++看 你第二個參數送的值都是爛的
作者: saladim (殺拉頂)   2014-11-07 12:27:00
是的 我用clang 然後去debug也是看到值是爛的 他裡面的
作者: legendmtg (CLANNAD)   2014-11-07 12:30:00
還有 不該直接繼承_Rb_tree_吧 應該用組合去包
作者: saladim (殺拉頂)   2014-11-07 12:32:00
好像是利用template type生成一個object之後用那個obj比繼承是因為很多function是protected....當然組合比較好不過herb stutter也提過沒辦法的話繼承也可以 不過被繼承那個東西要滿足一定條件 ORZ anyway,這邊是測試用的...補充一下 我有trace到拿id_那行到傳入std::less之前到進入less之前, 拿到的value都是對的.....
作者: legendmtg (CLANNAD)   2014-11-07 13:01:00
Node::Key寫錯了 要return referencteconst int& operator()(const Node& node) {return node.id_;} 這樣就對了
作者: saladim (殺拉頂)   2014-11-07 21:04:00
不能直接return "value"就好嗎? Cmp那邊再用value接起來?
作者: legendmtg (CLANNAD)   2014-11-07 23:38:00
我不知道 但是set的_Idenity和map的_Select1st都是return reference 而且改了後就對了 原因還是要看_Rb_tree的實作吧
作者: saladim (殺拉頂)   2014-11-08 17:10:00
好吧 看來是無解了 理論上 const int& 可以接 return回來的int value啦...
作者: Feis (永遠睡不著 @@)   2014-11-08 17:57:00
但是 const int & 跟 int 不等價尤其前者所指向的值可能會被其他地方改變.
作者: saladim (殺拉頂)   2014-11-09 11:53:00
我是確定插入後都沒在動過value,得去研究一下stl_tree原始碼

Links booklink

Contact Us: admin [ a t ] ucptt.com