这段C ++代码有什么问题?

时间:2012-02-13 12:59:51

标签: 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);
}

4 个答案:

答案 0 :(得分:4)

由于某些安全检查(由vs studio),它可能会失败。

为了比较事物,C ++标准要求比较正常工作:如果a < b得到真,那么b < a必须产生错误。

Visual Studio进行一些内部检查(构建调试时)以检查是否是这种情况。但是,您的比较将始终为true,因此无法正常工作。

除此之外:请描述确切的问题,并向我们展示您所包含的内容。 “string”不是自己的东西 - std :: string是由标准定义的,你可能在某处有using namespace std,这就不需要在字符串前面编写std ::。 - 然而,这被认为是不好的,应该避免。

答案 1 :(得分:4)

您的运营商无效。在stl的max实现中,有一个比较函数的断言,a < bb < a都是真的,它永远不会发生。如果你想到这一点,这应该永远不会发生。你的第二个功能没有这个问题所以它的工作原理。同时检查如果你返回false,它将起作用。

答案 2 :(得分:4)

显然,返回true的函数并不是严格的弱序。因此,max的行为未定义,编译器可能会选择执行任何操作。例如,它可以让守护进程从你的鼻子里飞出来。

如果使用后面的返回值,则它是严格的弱排序,因此代码按预期工作。

在旁注中,使用string* 取消学习。在C ++中,你应该很少通过指针传递东西(更喜欢(通常是常量)引用),更少使用new并且几乎从不使用delete(这就是std::auto_ptr(C ++) 03)或std::unique_ptr(C ++ 11)是为了)。在字符串(以及大多数其他STL容器)的特殊情况下,您应该按值使用它,并且只传递给函数优化到const引用。

答案 3 :(得分:0)

此代码适用于我的gdb(7.1)和g ++(4.4.3) 你可以发布你的g ++和gdb版本吗? 如果在与编译系统不同的系统上执行二进制文件 尝试强制静态链接并重新测试 另外请发布调试时出现的错误 BTw:你也可以使用 s1 > s2 lib运算符完美无缺。

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