我在类中重载了前缀和后缀增量/减量运算符。
#include <iostream>
using namespace std;
class X
{
public:
X() { cout << "X" << endl;}
~X() { cout << "~X" << endl; }
X& operator++() { X *x = new X; return *x; }
X operator++(int) { X *x = new X; return *x; }
X& operator--() { X *x = new X; return *x; }
X operator--(int) { X *x = new X; return *x; }
};
int main()
{
X p;
cout << endl;
++p;
cout << endl;
p++;
cout << endl;
return 0;
}
输出是:
X
X
X
~X
~X
似乎在使用postfix增量时,对象被实例化并删除,但是当使用前缀增量时,它不会被删除。
这种行为的原因是什么?
答案 0 :(得分:2)
您的postfix运算符按值返回,因此复制了使用new
创建的对象,并且由于您没有将其绑定到任何内容,因此{{1}中的后缀表达式末尾的副本将被销毁}。通过复制构造函数输出您可以观察到此行为的内容,请参阅示例here。
另一方面,前缀运算符只是返回对您使用main
分配的对象的引用,因此在new
中表达式的末尾只是引用被销毁。
在这两种情况下,您都会泄漏由main
分配的内存。
答案 1 :(得分:1)
postfix版本返回X
的实例,而不是对实例的引用,因此调用此副本的析构函数。无论如何,您不必在运算符中使用new
:
X& operator++() { return *this; }
X operator++(int) { X x; return x; }