C ++中带有参考变量的内存分配

msc*_*msc 5 c++ reference heap-memory c++11 c++14

我已经在G ++编译器中编译了以下代码,它工作正常,没有任何错误或警告。

#include <iostream>             
int main()                      
{                               
    int &r = *(new int(100));   
    std::cout << r << std::endl;
    return 0;                   
}
Run Code Online (Sandbox Code Playgroud)

参考变量如何与内存分配一起使用?

为参考变量分配内存是否有效?

Vla*_*cow 5

从C ++标准(5.3.1一元运算符)开始

1一元*运算符执行间接操作:对其应用的表达式应为指向对象类型的指针或为函数类型的指针,并且结果为指向表达式所指向的对象或函数的左值。如果表达式的类型为“ T的指针”,则结果的类型为“ T”。[注意:通过指向不完整类型(cv void除外)的指针进行的间接调用是有效的。 这样获得的左值可以有限的方式使用(例如,初始化引用);该左值不能转换为prvalue,请参见4.1。—尾注]

在此声明中

int &r = *(new int(100));
Run Code Online (Sandbox Code Playgroud)

声明了对通过使用*堆中创建的未命名对象的运算符获得的左值的引用。

最近,您可以使用参考删除对象

delete &r;
Run Code Online (Sandbox Code Playgroud)

考虑一个有关多态的更有趣的例子。

#include <iostream>

int main()
{
    struct A
    {
        virtual ~A()
        {
            std::wcout << "A::~A()" << std::endl;
        }
    };
    struct B : A
    {
        ~B()
        {
            std::wcout << "B::~B()" << std::endl;
        }
    };

    A &ra = *(new B);
    delete &ra;
}
Run Code Online (Sandbox Code Playgroud)

程序输出为

B::~B()
A::~A()
Run Code Online (Sandbox Code Playgroud)