使用C ++中的引用变量进行内存分配

时间:2017-05-22 07:11:01

标签: c++ c++11 reference c++14 heap-memory

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

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

参考变量如何处理内存分配?

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

2 个答案:

答案 0 :(得分:4)

来自C ++标准(5.3.1一元运算符)

  

1一元*运算符执行间接:表达式   应用它应该是指向对象类型的指针,或指向a的指针   函数类型,结果是引用对象或的左值   表达式指向的函数。如果是表达式的类型   是“指向T的指针”,结果的类型是“T”。 [注意:间接   通过指向不完整类型(cv void除外)的指针是有效的。   如此获得的左值可以以有限的方式使用(例如,初始化参考);此左值不得转换为   prvalue,见4.1。 - 后注]

在本声明中

int &r = *(new int(100));

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

最近你可以使用参考

删除对象
delete &r;

考虑一个更有趣的多态性示例。

#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;
}

程序输出

B::~B()
A::~A()

答案 1 :(得分:0)

new运算符返回指向它所分配的任何内容的指针。当您取消引用指针时,您将获得它指向的值的引用。就这么简单。

自C以来一直如此(虽然引用不是明确的事情)。它允许这样的代码:

void modify_my_int(int* the_int) { *the_int = 4; }

int main(void)
{
    int var;
    modify_my_int(&var);
    printf("%d\n", var); // prints "4"
}