C++ 运算符的返回类型=重载和字符串值

C++ 运算符的返回类型=重载和字符串值,c++,C++,In operator=若我将返回类型设置为object,而不是上述代码中的referencelike,则不会输出任何内容。如果我删除return*这个;并将返回类型更改为void,a1.str的值打印良好 我的问题是:如果返回类型为object,为什么会出现问题?如果返回类型为void,则不会出现问题?不管返回值的类型如何,strcpy似乎已经完成了字符串的复制。在这种情况下,我想我不必将返回类型设置为引用…这里有几个问题。 您的构造函数不执行任何操作。它应该初始化str 然后 应该是 thi

In operator=若我将返回类型设置为object,而不是上述代码中的referencelike,则不会输出任何内容。如果我删除return*这个;并将返回类型更改为void,a1.str的值打印良好


我的问题是:如果返回类型为object,为什么会出现问题?如果返回类型为void,则不会出现问题?不管返回值的类型如何,strcpy似乎已经完成了字符串的复制。在这种情况下,我想我不必将返回类型设置为引用…

这里有几个问题。 您的构造函数不执行任何操作。它应该初始化str

然后

应该是

this->str = new char[sizeof(str) + 1];
否则,您将复制到不属于您的内存中,因为sizeofstr只会给您一个char*的大小,并且您尝试将ref.str复制到此内存中。此外,您根本不应该删除赋值运算符中的现有对象。您应该更新它

你没有解构函数来释放内存

this->str = new char[strlen(ref.str) + 1];

这个代码有很多错误。一是你没有析构函数,所以内存到处都是。其次,赋值操作符的目的是更新现有对象,而不是用全新的对象替换它。第三,您不检查自分配,因此您正在删除同一对象的内存。第四,在确定new不会失败地返回之前删除str,因此,如果new抛出异常,您的对象现在将被损坏。简而言之,这段代码很容易通过代码审查。代码也会在我的机器上进行内核转储而中止。“我认为我们现在已经很好地进入了未定义行为的领域。”保罗·麦肯齐,谢谢。我只是在代码中省略了析构函数。如何检查自我分配?我必须使用try~catch out of new吗?@NBlizz-通过比较是否等于传入引用的地址来检查自我分配。如果是的话,你就把这个还给我。但是,如果使用复制交换习惯用法,则不需要检查自分配,除非出于优化目的。您还缺少复制构造函数。但总的来说,你为什么要反驳或反对合理的做法?返回一个引用,简单明了。@NBlizz-如果是这样!=&ref{do rest of code}返回*this;。此外,您的代码在此AAA a1fst上失败;AAA a2=a1;,所有这些都是由于缺少用户定义的复制构造函数。谢谢。此外,您根本不应该删除赋值运算符中的现有对象。你是说删除[]str;?我添加它是因为如果我将a2复制到a1,那么到a1的原始名称的链接将被破坏,因此会发生内存泄漏。如果将a2复制到a1,到a1的原始内存的链接将不会被破坏。鉴于问题是关于赋值运算符及其返回类型的,最好指出赋值运算符返回类型中的严重缺陷。
this->str = new char[sizeof(str) + 1];
this->str = new char[strlen(ref.str) + 1];
~AAA(){delete[] str;}