0

谁能解释在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 的范围应该只对 double 的函数有效,但它也可以在 main 函数中访问。

所以任何人都可以解释为什么会这样。我想这是一个小疑问,但无法弄清楚。

4

3 回答 3

4

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

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

这是一个没有动态分配的快速示例:

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

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

于 2012-09-06T13:58:11.423 回答
2

当你这样做时:

box *temp = new box;

您创建了一个动态分配的box对象,该对象超出了所有范围,并创建了一个位于本地范围内的box*被调用对象。temp您必须自己通过调用delete指向它的指针来释放动态分配的对象,例如,像这样:

delete temp;

上面代码行中唯一尊重范围的是实际的指针temp,它指向那个对象。

{
   box *temp = new box; // local box* points to dynamically allocated object
}
// temp is out of scope, but the object it pointed to is still alive (and unreachable)
于 2012-09-06T13:57:50.517 回答
1

的返回值doubled是一个由 分配的指针new。该指针的值是box堆上对象的地址,因此虽然temp是临时的,但它的值存储在obj2这一行

obj2 = obj1->doubled(); 

所以当你通过obj2它访问数据时仍然有效。

于 2012-09-06T13:58:51.987 回答