我已经在 G ++ 编译器中编译了以下代码,它运行正常,没有任何错误或警告。
#include <iostream>
int main()
{
int &r = *(new int(100));
std::cout << r << std::endl;
return 0;
}
参考变量如何处理内存分配?
为参考变量分配内存是否有效?
答案 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"
}