引用类成员(was)导致未定义的行为

时间:2015-03-29 04:49:13

标签: c++ class reference initialization

我正在尝试创建一个包含另一个类作为引用的类(私有成员)。

class example{
private:
    std::vector<char> chars;
};

class example2{
    example2(example to_be_initialized) :ref(to_be_initialized) { }
private:
    example& ref;
};

希望缺乏细节不会让任何人感到烦恼(我知道你们喜欢看到完整的代码,但我减少了它,因为如果这不是问题,那么我必须要弄清楚。但我会发布更多/其他如果需要),但我的代码与此非常相似,在做任何涉及ref的事情时我会得到奇怪的unicode字符。一旦我将ref更改为非引用,所有奇怪的未定义行为都会消失。

我想知道上述内容是否合法,仅供将来参考。我知道在这种情况下我不是通过引用类来保存大量内存(因为它只是复制指针,对吧?),但我觉得将来有必要这样做。

提前致谢。

1 个答案:

答案 0 :(得分:3)

代码存在一个主要问题:构造函数按值获取其参数,这意味着引用引用临时对象。在构造函数调用之后,它将作为悬空引用保留。

您需要从有效对象初始化引用。您可以通过将构造函数参数作为引用来执行此操作:

class example2
{
public:
    example2(example& to_be_initialized) : ref(to_be_initialized) { }

private:
    example& ref;
};

然后

example e;
example2 e2(e); // e2.ref and e are the same object

注意:您必须确保理解使用它的引用的语义。引用实际上并不像“指针”。它是一个且只有一个现有对象的别名。除非你实际上需要引用语义,否则你应该存储一个对象:

class example2
{
public:
    example2(const example& to_be_initialized) : ex(to_be_initialized) { }

private:
    example ex;
};