c++的new操作符作用域

C++ new operator scope

本文关键字:作用域 操作符 new c++      更新时间:2023-10-16

因此,我正在编写一段代码,其中我使用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);
}

是,用new创建的值在函数退出后仍然有效。

正如其他人提到的,有必要delete这些对象以避免内存泄漏。

因此,最好的通用c++实践是不要像这个函数那样返回裸指针,而是返回某种智能指针对象,比如shared_ptr。这样,您就可以返回一个指向新创建对象的指针,并且一旦不再有对该对象的活动引用,该对象将自动销毁。