C ++新的运营商范围
所以我写了一段代码,我使用new运算符在本地作用域函数内创建一个对象,并将引用作为指针返回。
A* operator+(A that){
int sumA = a + that.getA();
int sumB = b + that.getB();
return new A(sumA, sumB);
}
在我看来,这是行不通的,因为该对象是在本地作用域内创建的,应该是临时的,但它会被编译并运行。 任何人都可以向我解释这个吗? 我相信还有其他的东西有能力打破范围和东西。如果可能的话,你能给我一些例子吗? 不胜感激!
当你说“在局部范围内创建”时,你真正的意思是“自动变量”。 自动变量在其创建范围退出时自动销毁。
但是new
不会创建一个自动变量。 它创建一个动态分配的对象,其生命周期不受其创建的范围的约束。
由new A(sumA, sumB)
创建的对象不是临时的。
值总是从本地范围返回。 例如:
int f(int x)
{
int y = x*x;
return y;
}
虽然变量在超出范围时通常会消失,但函数返回的值会得到编译器的特殊处理。
关于你的例子,你正在堆上创建一个对象,并在本地堆栈上有一个指向该对象的指针。 当你的函数返回时,堆栈被清理干净,该指针随之一起被清理。 除了 - 因为你要返回指向调用者的指针,指针的副本会传回给调用者(可能通过一个cpu寄存器)。
顺便说一下:虽然这工作正常,但您需要确定调用方最终会删除返回的对象,否则您将发生内存泄漏。
C ++不会自动为您管理内存。 这意味着您必须手动'删除'用'new'操作符动态创建的任何对象。 你的代码是有效的,但我认为它没有达到你想要的。 我认为你正在寻找这样的东西:
A operator+(const A& that){
int sumA = a + that.getA();
int sumB = b + that.getB();
return A(sumA, sumB);
}
链接地址: http://www.djcxy.com/p/96547.html