1
12
问题似乎是
想必
更好的解决方案可能是将此类多阶段初始化分离为单独的方法,或者设计
|
2
3
如果看不到完整的代码,我会冒昧地猜测您正在走出内存块的边界。
尝试将断言放入正在取消对数组引用的关键位置,以确保索引有意义。即限制4名工人,并确保ID小于4。 |
3
2
调用纯虚函数意味着在开始执行子代的构造函数之前调用基类中纯的成员。在非多线程程序中,这意味着直接或间接地在基类的构造函数中。在多线程程序中,当构造函数在构造函数中启动线程,并且系统在终止构造函数之前执行线程时,也可能发生这种情况。 |
4
2
在初始化期间,类只是部分构造的。具体地说,构造函数必须从最前面的类开始执行,这样每个派生类的构造函数就可以安全地访问其基本成员。 这意味着部分构造类的vtable不能处于其最终状态-如果允许虚拟方法调用派生类,那么将在调用类构造函数之前调用这些方法。 也就是说,在构造过程中,纯虚函数实际上是纯虚函数。现代C++编译器正在更好地捕捉这一点,但在很多情况下,它可能会以非法的方式“埋葬”非法调用,这样编译器就不会注意到错误。 故事的寓意:不要在构造函数中做任何将调用虚拟函数的事情。它不会像你期望的那样。即使不纯净。 |
5
1
我没有看到在您的任何代码示例中构造的变量类。您确定要传递的ID在工作数组的范围内吗?另外,您正在使用“new”构建对象,对吗?如果您在堆栈上构造了对象,它将向控制器注册自己,但在构造函数返回之后,对象将立即被销毁,但控制器将保留指向堆栈上对象的指针。 此外,您的BaseWorkerClass析构函数应该与Workervariant析构函数一起是虚拟的,以确保在删除BaseWorkerClass数组时调用它们。 从我的评论到另一个问题,考虑使用std::vector而不是双指针。维护、理解和消除维护阵列的需要更容易。 似乎您在这里添加了一个不必要的抽象层。我认为ID不应该是子类接口的一部分。我认为这样的事情对你会更好:
|
6
0
我曾经收到过这个错误消息,虽然它与询问者的确切情况无关,但我添加了这个消息,希望它对其他人有用: 我通过做一个干净的构建来解决这个问题。 |
7
0
在对象被销毁后,您是否有机会访问它们?因为在销毁过程中,vtable指针会逐渐“回滚”,以便vtable条目将指向基类的方法,其中一些方法是抽象的。在删除对象之后,可以像在基类的析构函数期间那样保留内存。 我建议您尝试使用内存调试工具,例如 valgrind 或 MALLOC_CHECK_=2 . 在Unix上,很容易获得针对此类致命错误的stacktrace。只需在gdb下运行应用程序,或者 TotalView ,当错误发生时,它将自动停止,您可以查看堆栈。 |
Brendan · Java中从父类继承的对象的ArrayList 2 年前 |
Tali · 继承-您应该使用基类,还是它们只是子类的框架? 2 年前 |
mask2 · 如何轻松访问继承类的功能? 2 年前 |
Dimon · 父类中的Setter,以及一些没有参数的子类 2 年前 |
Miguerurso · Javascript类继承无法正常工作 2 年前 |
GuessMe · 返回新类对象的正确方法(也可以扩展) 2 年前 |
Daniel Lizik · 重写父类构造函数的子类成员初始值设定项 2 年前 |
i_know_what · 以基类作为参数重写错误的方法 2 年前 |