2012-02-13 112 views
0

我剛剛開始使用C++進行編程,並且正在使用模板。這段C++代碼有什麼問題?

以下代碼在運行時失敗,我不知道爲什麼。 (請注意,這只是一個示例代碼和在生產中不使用)

bool maxCompare(string* s1,string* s2){ 
    cout<<*s1<<endl; 
    cout<<*s2<<endl;  
    return true; //If I comment this line and instead use the line below, it works fine. 
    //return *s1 < *s2; 
} 

int main() 
{ 
    string* s1=new string("Hello"); 
    string* s2=new string("Hi"); 
    string *s3= max(s1,s2,maxCompare); 
} 
+2

'G ++ -g -Wall source.cpp'比'GDB/a.out'和GDB:'run'比'bt'當它失敗......或者,如果你」足夠geeky:'開始; S; S; S; ;?s ...':) – Vyktor 2012-02-13 13:03:25

+1

什麼是'max' ... – 2012-02-13 13:05:40

+1

哪個編譯您使用的?你不能在調試模式下在MSVC上執行此操作 – mkaes 2012-02-13 13:06:41

回答

4

您的操作員無效。在stl的max的實現中,比較函數有一個斷言,它永遠不會發生a < bb < a爲真。如果你想一點,這應該永遠不會發生。你的第二個功能沒有這個問題,所以它的工作原理。另外檢查一下,如果你返回false,它會起作用。

+0

「返回false」;作品!怎麼樣? – Prashanth 2012-02-13 13:33:11

+0

@Prashanth:如果'a 2012-02-13 13:43:32

4

它可能會失敗,因爲一些安全檢查(用vs工作室)..

對於C++標準要求比較東西比較工作是否正確:如果a < b爲真,則比b < a必須產生錯誤。

Visual Studio會進行一些內部檢查(構建調試時)以檢查是否屬於這種情況。然而,你的比較總是會成真的,所以它不能正常工作。

除此之外:請描述確切的問題,並向我們展示您包含的內容。 「string」不是自己的東西--std :: string是由標準定義的,你可能有using namespace std的地方,它不需要在字符串前寫std ::。 - 但這被認爲是不好的,應該避免。

+0

+1:請描述確切的問題 – nkint 2012-02-13 13:45:44

4

顯然函數總是返回true不是一個嚴格的弱排序。因此,max的行爲沒有被定義,編譯器可以選擇做任何想做的事情。例如,它可以使守護進程從你的鼻子飛出。

如果您使用較晚的返回值,它是嚴格的弱排序,所以代碼按預期工作。

請注意,忘記使用string*。在C++中,你應該很少用指針(更喜歡(通常爲常數)參考代替)傳遞的事情,更是很少使用new和幾乎從來不使用delete(這是std::auto_ptr(C++ 03)或std::unique_ptr(C++ 11)是)。在字符串(以及大多數其他STL容器)的特殊情況下,您應該按值使用它,並且僅用於傳遞給函數以優化常量引用。

+2

+1鼻子守護進程 – 2012-02-13 13:30:46

0

此代碼工作就好了我的GDB(7.1)和g ++(4.4.3) 你可以發佈您的g ++和gdb的版本?
如果您在與編譯系統不同的系統上執行二進制文件,嘗試強制靜態鏈接並重新測試。
也請在調試時發佈錯誤。
BTW:您還可以使用 s1 > s2 LIB運營商,其工作完全正常。

g++ -g -Wall source.cpp -static