绑定引用实际上是否评估操作数?

Does binding a reference actually evaluate the operand?

考虑这段代码:

int& x=*new int;

赋值的RHS是否真的解引用了新创建的指针,导致读取未初始化的变量导致UB?或者这可以合法地用于以后分配一个值,如 x=5;?

据我所知,您所做的 none 涉及未定义的行为。

但是,它确实会立即产生内存泄漏的风险。它可以被快速解析(因为 &x 会解析到泄漏内存的地址,因此可以被删除)但是如果你要离开范围,你将无法检索该指针。

编辑:切中要点,如果你要写

int& x=*new int;
x = 5;

std::cout << x << std::endl;

std::cin >> x;

std::cout << x << std::endl;

代码的行为就好像您只是将 x 声明为 int x;,除了指针在程序退出作用域后也会悬空。

如果您在给它赋值之前尝试读取未初始化的变量,您将实现未定义的行为,但如果 x 是堆栈分配的,那不会是不正确的。

我不建议这样做。将动态内存与看起来静态的变量混为一谈对我来说似乎很危险。考虑以下代码

#include <iostream>

int* dynamicAlloc() {
    int& x = *new int;
    std::cout << "Inside dynamicAlloc: " << x << std::endl;
    std::cout << "Modified: " << (x = 1) << std::endl;
    return &x;
}

int main() {
    int *dall = dynamicAlloc();;

    std::cout << "dall (address): " << dall << std::endl;
    std::cout << "dall -> " << *dall << std::endl; // Memory not cleaned

    delete dall; // Don't forget to delete

    return 0;
}

我得到这样的输出:

Inside dynamicAlloc: -842150451
Modified: 1
dall (address): 00F642A0
dall -> 1

请注意取消引用 dall 不会导致段错误。当 x 超出范围时,它不会被释放。否则可能会发生段错误。

结论:

int& x 使 x 成为动态分配内存的别名。您可以合法地修改该内存,但它不会自动清理,因为它会自动超出范围,很容易导致潜在的内存泄漏。