我运行时我的程序崩溃了。如果我注释掉if((str1->compare(*str2))==0 ){...}
行,那就行了。我不知道如何比较我在比较后创建和删除的字符串*的两个元素。
main.cpp: In function `int operator==(const Integer&, const Integer&)':
main.cpp:18: warning: taking address of temporary
main.cpp:19: warning: taking address of temporary
Integer.h
class Integer {
public:
Integer(int val, char *opis):m_val(val),m_opis(opis)
{
this->m_val = 0;
this->m_opis = strdup("0");
}
friend int operator==(const Integer&,const Integer&);
private:
int m_val;
char *m_opis;
}
的main.cpp
int operator==(const Integer&a, const Integer&b){
string *str1 = &string ( a.m_opis );
string *str2 = &string ( b.m_opis );
if((str1->compare(*str2))==0 ){return 1 ;} //<- Here is my problem i think.
delete str1;
delete str2;
return 0;
}
}
//Objects and comparing
Integer o1(15,"lala");
Integer o2(150,"lala");
Integer o3;
cout<<o1==o2;
答案 0 :(得分:3)
问题是str1
和str2
是dangling pointers,因为在调用str1->compare()
时它们指向的临时对象不再存在:这就是编译器正在警告。
不要在这里使用动态对象,使用堆栈分配的对象:
string str1(a.m_opis);
string str2(b.m_opis);
其他要点:
std::string
而不是char*
(Integer.m_opis
)。相关What is The Rule of Three? m_opis
在构造函数中被设置两次,Integer
的所有实例将具有相同的字符串"0"
(相同的不是相同的缓冲区,但内容相同)。同上m_val
。