c++ - 如何在类构造函数中绑定对堆栈分配类的引用?
问题描述
我有这门课
class HumanA
{
public:
HumanA(std::string name, Weapon weapon);
~HumanA(void);
inline void attack(void)
{
std::cout << _name << " attacks with his " << _weapon.getType();
}
private:
std::string _name;
Weapon &_weapon;
};
和这个构造函数
HumanA::HumanA(std::string name, Weapon weapon) : _name(ft::strcapitalize(name)), _weapon(weapon)
{
}
我在编译时收到此错误
HumanA.cpp:15:91: error: binding reference member '_weapon' to stack allocated
parameter 'weapon' [-Werror,-Wdangling-field]
...name, Weapon weapon) : _name(ft::strcapitalize(name)), _weapon(weapon)
^~~~~~
./HumanA.hpp:35:12: note: reference member declared here
Weapon &_weapon;
^
1 error generated.
不能引用堆栈分配的内存吗?这个错误对我来说似乎很奇怪。
解决方案
思考:
- 对象的范围和“生存时间”是
Weapon weapon
什么? - 会员对同一问题的答案是什么
Weapon &_weapon
?
第一个问题的答案是这样的:weapon
只要构造函数在执行就存在。这是一个堆栈分配的变量,在构造函数完成其工作时不再存在。
第二个问题的答案是:_weapon
只要包含这个成员的对象存在,成员就存在。
所以 的 寿命比weapon
的短_weapon
。现在,当您将引用绑定到其生存时间比引用短的对象时会发生什么?好吧,你会得到一个悬空的参考。对您不拥有的内存的引用。除非使用了一些特殊的诊断工具,如 valgind,否则很难发现和跟踪的严重错误。换句话说,您可以自由地编写此代码,但您只能在程序位于构造函数中时访问该成员。这不是你的本意,不是吗?
推荐阅读
- google-cloud-platform - 如何删除大查询分区表?
- python - 如何使用 Python 登录网站
- ios - How to find the iOS SDK version that an app is using?
- asp.net-core-2.0 - Azure cosmosdb mongo api error ion asp.net core
- c# - Shorten Code by accessing Dictionary with if
- bash - grep with PCRE on macOS
- python - How can I control the topology of neural network when using MLPClassifier?
- vim - Vim:匹配第 N 次出现的 PATTERN 并仅在匹配行上突出显示该模式
- java - 从类调用方法时出现 NullPointerExceptionError
- reactjs - Create-react-app-parcel-typescript with Jest