绑定参考实际上实际评估了操作数

Does binding a reference actually evaluate the operand?

本文关键字:评估 操作数 参考 实际上 绑定      更新时间:2023-10-16

考虑此代码:

int& x=*new int;

作业的RHS实际上是否取消了新创建的指针,导致UB由于读取了非初始化的变量吗?还是可以合法地用于分配x=5;之类的值?

据我所知,您所做的一切都不涉及不确定的行为。

它确实会立即产生内存泄漏的风险。它可以快速解决(因为&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取消给出不导致segfault。当X掉落范围时,它没有被划分。否则可能会发生segfault。

结论:

int& x使x成为动态分配的内存的别名。您可以合法地修改该内存,但是它不会清理,因为它会自动从范围中掉落,从而导致潜在的内存泄漏。