代码之家  ›  专栏  ›  技术社区  ›  bjskishore123

动态分配的对象成员变量正在引用堆栈内存

  •  3
  • bjskishore123  · 技术社区  · 14 年前

    我有以下代码

    class Test
    {
    public:
        int &ref;
        int a;
    
        Test(int &x)
            :ref(x)
        {
            cout<<"Address of reference "<<&ref<<endl;
            cout<<"&a : "<<&a<<endl;
            cout<<"this = "<<this<<endl;
        }
    };
    
    int main()
    {
        Test *pObj = NULL;
        {
            int i = 10;
            cout<<"Address of referent "<<&i<<endl;
            pObj = new Test(i);
        }
        pObj->ref++;
        cout<<pObj->ref;
    }
    

    输出为:

    Address of referent 002DFB3C
    
    Address of reference 002DFB3C
    
    &a : 00734C94
    
    this = 00734C90
    

    如您所见,正在动态创建测试对象。存储在堆栈上的变量i作为参数发送给测试类的构造函数。我打印了变量i、ref和a的地址。

    问题:一旦程序控制退出声明变量I的块,它将被销毁。但动态分配对象的成员变量ref仍将引用堆栈地址(地址i)。我死后能使用REF。

    为什么堆对象引用了堆栈内存?为什么允许这样做?

    1 回复  |  直到 14 年前
        1
  •  8
  •   James McNellis    14 年前

    为什么堆对象引用了堆栈内存?

    因为您传递了局部变量 i 通过引用到 Test 对象,然后构造函数存储了该引用。

    为什么允许这样做?

    在C++中,程序员负责确保使用的指针都指向有效对象。语言没有任何保护来“保护”您不做这种愚蠢的事情(当然,存在一些好的编程实践来帮助您确保编写的代码不应该有这样的问题)。

    在对象的生存期结束后尝试使用该对象会导致未定义的行为。