所以我编写了一段代码,我使用new运算符在局部作用域函数内创建一个对象,并将引用作为指针返回。
A* operator+(A that){
int sumA = a + that.getA();
int sumB = b + that.getB();
return new A(sumA, sumB);
}
在我的想法中它不起作用,因为该对象是在本地范围内创建的,应该是临时的,但它是编译并运行的。谁能向我解释一下这个?我相信还有其他东西有能力打破范围和东西..如果可能的话,你能给我一些例子吗?理解!
答案 0 :(得分:4)
当你说"在本地范围内创建"你真正的意思是"一个自动变量。"自动变量在创建它们的范围退出时自动销毁。
但new
不会创建自动变量。它创建一个动态分配的对象,其生命周期不受其创建范围的约束。
由new A(sumA, sumB)
创建的对象不是临时的。
答案 1 :(得分:0)
值始终从本地范围返回。例如:
int f(int x)
{
int y = x*x;
return y;
}
虽然变量在超出范围时通常会消失,但函数返回的值会得到编译器的特殊处理。
关于您的示例,您正在堆上创建一个对象,并在本地堆栈上有一个指向该对象的指针。当你的函数返回时,堆栈被清理掉,那个指针就跟着它了。除了 - 因为您将指针返回给调用者,指针的副本将传递回调用者(可能通过cpu寄存器)。
顺便说一下:虽然这很好用,但你需要确定调用者最终会删除返回的对象,否则你会有内存泄漏。
答案 2 :(得分:0)
C ++不会自动为您管理内存。这意味着您必须手动删除'使用' new'动态创建的任何对象运营商。您的代码有效,但我认为它并没有达到您的目的。我想你正在寻找这样的东西:
A operator+(const A& that){
int sumA = a + that.getA();
int sumB = b + that.getB();
return A(sumA, sumB);
}
答案 3 :(得分:0)
是的,在函数退出后,使用new
创建的值仍然有效。
正如其他人所提到的,有必要delete
这些对象来避免内存泄漏。
正因为如此,最好的一般C ++实践是不返回像这个函数那样的裸指针,而是返回某种智能指针对象,例如shared_ptr
。这样,您可以返回指向新创建的对象的指针,并且一旦没有更多活动引用,该对象将自动销毁。