c++的new操作符作用域
C++ new operator scope
因此,我正在编写一段代码,其中我使用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
。这样,您就可以返回一个指向新创建对象的指针,并且一旦不再有对该对象的活动引用,该对象将自动销毁。
相关文章:
- 未在作用域中声明unordered_map
- 有没有一种方法可以在编译时获得作用域类名
- C++quit()函数中可能存在作用域问题
- 未在此作用域OpenCV3.4中声明cvSaveImage
- 全局作用域中函数指针的赋值
- 在类函数中初始化外部作用域变量
- 不同作用域中的静态变量和全局变量
- 重载操作符+:表达式必须是整型或无作用域枚举类型
- 返回指向类定义的结构体的指针,多个作用域操作符
- 奇怪语法:作用域操作符(::)后面有星号
- 作用域操作符的不同用法
- 为什么c++的作用域解析操作符是::
- 在Visual Studio 2012中,作用域操作符中的错别字会导致意外的编译和递归
- ::操作符能否出现在与限定名查找中的作用域解析不同的上下文中?
- 作用域,操作符,函数错误需要帮助
- c++的new操作符作用域
- 在类定义的类名中,作用域解析操作符的作用是什么?
- 关于c++中作用域解析操作符的问题
- 为什么基类构造函数没有被作用域解析操作符调用
- 命名空间作用域中的操作符在全局作用域中隐藏另一个操作符