绑定参考实际上实际评估了操作数
Does binding a reference actually evaluate the operand?
考虑此代码:
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成为动态分配的内存的别名。您可以合法地修改该内存,但是它不会清理,因为它会自动从范围中掉落,从而导致潜在的内存泄漏。
相关文章:
- std::condition_variable::wait()如何评估给定的谓词
- 控制允许动态运行c++的并发操作数
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- c++11评估顺序(未定义的行为)
- 错误 C2679:二进制"<<":未找到采用类型 'std::string_view' 的右侧操作数的运算符(或者没有可接受的转换)
- C++ 带有向量的 IF 计算操作数
- 是否所有C++运算符都接受操作数?
- 一元*运算符的操作数是否期望一个 prvalue
- 与'operator='不匹配(操作数类型'String'且"void")
- 如何使用"equal to"以外的评估编写开关语句
- 嵌套 if 中没有返回评估
- 懒惰的参数评估try_emplace?
- 不正确的操作数类型 MSVC
- C2678 二进制 '==':未找到采用 'Card' 类型左操作数的运算符(或者没有可接受的转换)
- 错误:类型"double()"和"double()"的操作数无效到二进制&quo
- 在实践中,在运行时为零的乘法中是否有任何"lazy"评估
- C++评估顺序优化是否意味着对不同的操作数使用不同的内核?
- 绑定参考实际上实际评估了操作数
- 为什么在未评估的操作数中不允许使用lambda表达式,而是允许在恒定表达式的未评估部分中
- Postfix评估如何检测运算符与操作数