2012-02-13 324 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