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

上一篇: C++ new operator scope

下一篇: Detecting stack or heap allocation