绑定引用实际上是否评估操作数?
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 成为动态分配内存的别名。您可以合法地修改该内存,但它不会自动清理,因为它会自动超出范围,很容易导致潜在的内存泄漏。
考虑这段代码:
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 成为动态分配内存的别名。您可以合法地修改该内存,但它不会自动清理,因为它会自动超出范围,很容易导致潜在的内存泄漏。