我注意到这个奇怪的行为/错误,在初始化实际对象之前,类方法被称为。我有一个包装器对象,它有 由于实际的代码示例非常复杂并且取决于许多其他内容,我只会展示可能无法正确编译的C ++代码段: 标准中是否有定义可能允许此类行为的内容?或者更确切地说,是否有一些隐含的构造等可以绕过默认构造?operator->()
方法。现在,当我使用operator->()
方法将对象作为构造函数中的构造函数参数传递给另一个对象时,实际的包装器对象不会被构造,而只是运行operator->()
方法。 / p>
template<typename T>
class wrapper_object_type
{
public:
wrapper_object_type() {/*does not run*/}
T* operator->() {/*does run*/}
};
class bad_behaviour
{
public:
bad_behaviour() : another_object(wrapper_object->t_object)
{/*crashes(0xccc access violation*/}
};
答案 0 :(得分:2)
可能在初始化之前使用wrapper_object
。成员变量的构造顺序与它们在类中声明的顺序相同,因此请确保在wrapper_object
之前声明another_object
。
(假设wrapper_object
和another_object
是bad_behaviour
的成员变量,但没有更合理的代码示例,很难说。)
答案 1 :(得分:0)
嗯,我做到了硬道;我将对象从堆栈切换到堆,并通过new
关键字而不是初始化列表显式初始化它们。正如我所想,这并没有重现奇怪的行为,所以它按预期工作。我现在想的是,它实际上可能是一个编译器错误,因为我通过初始化程序列表的方式类似于我如何解决问题。唯一改变的是我之前没有在堆中分配它们的事实。
我还尝试提供可以重现错误的工作代码,但是那里没有显示错误。这可能是因为注意到bug的实际代码非常依赖于模板类型和包装器对象。由于它现在可以在堆中分配对象时使用,因此错误不在代码中,而是在编译器中。