-3

我注意到这种奇怪的行为/错误,其中在初始化实际对象之前调用了类方法。我有一个包装对象,它有operator->()方法。现在,当我使用该operator->()方法将对象作为构造函数中的构造函数参数传递给另一个对象时,实际的包装器对象不会被构造,而只是运行该operator->()方法。

由于实际的代码示例非常复杂并且依赖于许多其他的东西,我将只展示可能无法正确编译的 C++ 代码片段:

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*/}
};

那么标准中是否定义了一些可能允许这种行为的东西?或者更准确地说,是否有一些隐式构造等可以绕过默认构造?

4

2 回答 2

2

可能您wrapper_object在初始化之前使用它。成员变量的构造顺序与它们在类中声明的顺序相同,因此请确保wrapper_object在声明之前another_object

(假设wrapper_objectanother_object是 的成员变量bad_behaviour,但没有更合理的代码示例很难说。)

于 2013-01-09T22:13:08.313 回答
0

好吧,我确实做到了;我将对象从堆栈切换到堆,并通过new关键字而不是在初始化列表中显式初始化它们。正如我所想的那样,这并没有重现奇怪的行为,所以它按预期工作。我现在在想的是,它实际上可能是一个编译器错误,因为我通过初始化列表执行此操作的方式类似于我解决问题的方式。唯一改变的是我之前没有在堆中分配它们。

我还尝试提供重现该错误的工作代码,但该错误未显示在那里。这可能是因为发现错误的实际代码在很大程度上依赖于模板类型和包装对象。当对象在堆中分配时,它现在可以工作,错误不在代码中,而是在编译器中。

于 2013-01-10T15:03:18.313 回答