这段C++代码出了什么问题

What is wrong with this piece of C++ code?

本文关键字:什么 问题 C++ 代码 这段      更新时间:2023-10-16

我刚刚开始用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);
}

您的运算符无效。在stl对max的实现中,对比较函数有一个断言,即a < bb < a都为true是不可能发生的。如果你想一想,这不应该真的发生。您的第二个函数没有这个问题,所以它可以工作。还要检查一下,如果你返回false,它会起作用。

它可能因为一些安全检查而失败(vs studio)。。

对于比较事物,C++标准要求比较正确:如果a < b产生true,那么b < a必须产生false。

Visual studio会进行一些内部检查(在为调试而构建时),以检查是否存在这种情况。然而,你的比较总是正确的,所以它不能正确工作。

除此之外:请描述确切的问题,并向我们展示您包含的内容。"string"本身并不是什么东西-std::string是由标准定义的,你可能在某个地方有using namespace std,它消除了在字符串前面写std::的需要。-然而,这被认为是不好的,应该避免。

显然,总是返回true的函数不是严格的弱排序。因此,max的行为没有定义,编译器可以选择做它想做的任何事情。例如,它可能会让守护进程飞出你的鼻子。

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

附带说明一下,使用string*进行无铅化。在C++中,您应该很少通过指针传递内容(更喜欢(通常是常量)引用),甚至很少使用new,几乎从不使用delete(这就是std::auto_ptr(C++03)或std::unique_ptr(C++11)的作用)。在字符串(和大多数其他STL容器)的特殊情况下,应该按值使用它,并且只用于传递给优化为常量引用的函数。

此代码与我的gdb(7.1)和g++(4.4.3)配合良好你能发布你的g++和gdb版本吗
如果在不同于编译系统的系统上执行二进制文件尝试强制静态链接并重新测试
此外,请发布调试时出现的错误
BTw:你也可以使用s1 > s2lib运算符,工作非常好。

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