C++比较运算符重载中第一个参数为 null 时出现分段错误



我正在编写一个名为Word的类,它处理 c 字符串并重载<><=>=运算符。

word.h

friend bool operator<(const Word &a, const Word &b);

word.cc

bool operator<(const Word &a, const Word &b) {
if(a == NULL && b == NULL)
return false;
if(a == NULL)
return true;
if(b == NULL)
return false;
return strcmp(a.wd, b.wd) < 0;  //wd is a valid c string, EDIT: changed to strcmp
}

main

char* temp = NULL;     //EDIT: i was mistaken, temp is a char pointer
Word a("blah");    //a.wd = [b,l,a,h]
cout << (temp<a);

我在operator<方法的第一行之前收到分割错误 在main的最后一行之后。我可以通过写来纠正问题

cout << (a>temp);

其中operator>定义类似,我没有收到任何错误,但我的 作业需要(temp < a)才能工作,所以这是我寻求帮助的地方。

编辑:我第一次犯了一个错误,我说temp是Word型, 但它实际上是char*型.所以我假设编译器转换 使用我的一个构造函数临时到Word。我不知道会是哪一个 使用以及为什么这会起作用,因为第一个参数不是Word.

这是我认为用于使用temp进行Word的构造函数:

Word::Word(char* c, char* delimeters="n") {
char *temporary = "";
if(c == NULL)
c = temporary;
check(stoppers!=NULL, "(Word(char*,char*))NULL pointer"); // exits the program if the expression is false
if(strlen(c) == 0)
size = DEFAULT_SIZE;  //10
else
size = strlen(c) + 1 + DEFAULT_SIZE;
wd = new char[size];
check(wd!=NULL, "Word(char*,char*))heap overflow");
delimiters = new char[strlen(stoppers) + 1];      // EDIT: changed to []
check(delimiters!=NULL,"Word(char*,char*))heap overflow");
strcpy(wd,c);
strcpy(delimiters,stoppers);
count = strlen(wd);
}

wd属于char*类型

感谢您查看这个大问题并尝试提供帮助。 让我知道您是否 需要更多代码来查看

我几乎可以肯定你不是想在堆上构造一个char,其初始值是基于stoppers大小的某个整数:

delimiters = new char(strlen(stoppers) + 1); // Should use [] not ()

你也在使用C++,我永远不会告诉你该怎么做,但请,除非你确切地知道没有危险,否则不要使用strcpy.正是出于这个原因。

它是字符串的盲副本,当目标没有足够的空间时(就像您的错别字分配一样),事情就会变得糟糕。

编辑:

我也看到你使用的operator<超载

a.wd < b.wd

并声称 .wds 是有效的 C 字符串。如果是这种情况,则不能对它们应用简单的<运算符,而必须使用strcmpstrncmp或其他一些完整的比较函数>

去掉构造函数的其他位:

Word::Word(char* c, char* delimeters=NULL) {
check(stoppers!=NULL, "(Word(char*,char*))NULL pointer");  //exits the program if the expression is false
delimiters = new char[strlen(stoppers) + 1];
check(delimiters!=NULL,"Word(char*,char*))heap overflow");
strcpy(delimiters,stoppers);
}

您正在分配和复制到输入参数 (delimiters) 而不是成员变量 (stoppers)。因此,当您调用:

delimiters = new char[strlen(stoppers) + 1];

在这里,stoppers == NULL(从check调用推断)所以strlen(NULL)崩溃。

此外,在:

bool operator<(const Word &a, const Word &b)

您检查诸如a == NULL之类的内容。这不需要,因为ab是引用,因此对象为非 null。

如果wd可以为 null,则需要更改这些内容以检查a.wdb.wd

相关内容

  • 没有找到相关文章

最新更新