c++ - 如何在类构造函数中绑定(bind)对堆栈分配类的引用?

标签 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.

难道不能引用堆栈分配的内存吗?这个错误对我来说似乎很奇怪。

最佳答案

思考:

  1. 武器 weapon 对象的范围和“生存时间”是多少?
  2. 成员 Weapon &_weapon 对同一问题的答案是什么?

第一个问题的答案是:weapon 只要构造函数在执行就存在。这是一个堆栈分配的变量,在构造函数完成其工作时不再存在。

第二个问题的答案是:只要包含该成员的对象存在,成员_weapon就存在。

所以 weapon 的生存时间比 _weapon 的生存时间。 现在,当您将引用绑定(bind)到一个生存时间短于引用的对象时会发生什么?好吧,你会得到一个悬空的引用。对不属于你的内存的引用。除非使用一些特殊的诊断工具,如 valgind,否则很难发现和跟踪的严重错误。换句话说,您可以自由编写此代码,但只有当您的程序在构造函数中时,您才能访问该成员。这不是您想要的,不是吗?

关于c++ - 如何在类构造函数中绑定(bind)对堆栈分配类的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65656677/

相关文章:

c++ - 无效、无效、C 和 C++

c++正则表达式获取2个标签之间的所有文本,包括换行符和空格

c++ - 在 C/C++ 中,我想多次写入同一个管道

c++ - 如何在 VC++ 中给一个标识符下毒?

c++ - 优先队列错误

c++ - 使用 EOF 函数作为条件

c++ - 初始化C++基类,而无需两次键入整个基类类型

c++ - 通过引用传递,仅限子范围?

c++ - 使用巨大的 Valgrind 和低级 C++ API

用于将 UI 设计与业务逻辑分离的 C++ 框架