c++ - cpp中对象的范围

标签 c++ object scope

谁能解释一下在cpp中创建的对象的范围

#include <iostream>
using namespace std;

class box
{
    public:
        int i;
        box* doubled ();
};

box* box::doubled ()
{
    box *temp = new box;
    temp->i = 2*this->i;
    return temp;
}

int main ()
{
    box *obj1 = new box;
    obj1->i = 5;

    box *obj2;
    obj2 = obj1->doubled();
    delete obj1;
    cout << "i = " << obj2->i << endl;
    return 0;
}

在上面的示例代码中,obj2 是一个指针,它保存由函数 Doubled 创建的内存。 temp 的范围应该只对函数 doubled 有效,但它也可以在 main 函数中访问。

那么谁能解释为什么会这样。我想这是一个小疑问,但无法弄清楚。

最佳答案

您没有删除函数 doubled 中动态创建的对象,因此指向它的指针当然仍然有效。运算符 new 动态分配对象,并且它们保留在内存中直到被显式销毁。只有指向内存地址的指针(temp 变量)被销毁了,但由于您返回了它的值(地址),内存仍然属于程序。实际上不删除会造成内存泄漏。

如果您希望对象在范围结束后被删除,您应该使用 std::unique_ptr

这是一个没有动态分配的简单示例:

T* foo ()
{
    T T_instance;
    return &T_instance;
}

它甚至不应该编译,消息类似于returning address of local variable or temporary,表明T_instance将在程序退出后销毁 foo().

关于c++ - cpp中对象的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12301723/

相关文章:

javascript - 为多个脚本标签定义 JavaScript 函数

python - 传递给另一个模块时 lambda 函数的范围

c++ - 日志文件输出问题 - string 和 c_str 之间的区别 - C++

java - 声明类名与构造函数名不同的 Java 对象

C++ 模板 : conditionally enabled member function

java - 将对象放入 JDBC 中?

javascript - 对象的属性如何访问其他属性?

c++ - 带初始化的while语句

c++ - 表达式类型

c++ - 将 onPositionChanged 事件传播到 QtQuick 1.1 中的背景项