C++ 指针容器问题
我有C++ 指针容器问题,c++,templates,pointers,stl,exc-bad-access,C++,Templates,Pointers,Stl,Exc Bad Access,我有A、B、C、D等类别,以及以下层次结构: class A { B* b; }; class B { C<D>* c; }; template <class T> class C<T> { list<T*> ds; }; class D { }; A类{ B*B; }; B类{ C*C; }; 模板 C类{ 列表ds; }; D类{ }; 我首先使用newa()将A分配为基类中的A*成员。在A中,我使用new b
A
、B
、C
、D
等类别,以及以下层次结构:
class A {
B* b;
};
class B {
C<D>* c;
};
template <class T>
class C<T> {
list<T*> ds;
};
class D {
};
A类{
B*B;
};
B类{
C*C;
};
模板
C类{
列表ds;
};
D类{
};
我首先使用newa()
将A
分配为基类中的A*
成员。在A
中,我使用new b()分配b
。在B
中,我使用newc()
分配c
我一尝试调用ds.size()
程序就会崩溃。当它试图在size()
中调用其begin()
方法时,EXC\u BAD\u ACCESS
在ds
中出现
你知道为什么会这样吗?我已经使用C++几年了,但这是我第一次使用标准容器中的指针,所以也许我缺少一些明显的东西。当您将元素插入容器或类似的东西时,您需要确保您的元素类型支持所有必要的功能(即,其可分配、可复制,并根据容器类成员中需要的功能在其中具有正确的功能)
虽然.size函数应该只返回一个内部成员的值,但这对于崩溃的东西来说没有多大意义。你确定所有东西都在你的真实代码中正确分配了吗?在我看来,调用链中的某个地方有一个未初始化的指针。据我所知,您的代码不应该以任何方式关心列表ds的内容。当您将元素插入容器或类似的东西时,您需要确保您的元素类型支持所有必要的功能(即,其可分配、可复制,并根据容器类成员中需要的功能在其中具有正确的功能)
虽然.size函数应该只返回一个内部成员的值,但这对于崩溃的东西来说没有多大意义。你确定所有东西都在你的真实代码中正确分配了吗?在我看来,您似乎只是在调用链中的某个位置有一个未初始化的指针。但是我认为类A
的成员b
是默认的,它是私有的。也许这会导致EXC\u BAD\u访问
,但我认为A类
的成员b
是默认的private
。可能是它导致了EXC\u BAD\u访问
这不足以诊断问题。同时使用调试器来确保列表
代码中的代码出现错误,我对此深表怀疑。提供一个测试用例来演示这个问题。因此我认为这种结构理论上没有问题,应该可以吗?只要知道我没有错过一些明显的东西就好了。我不会说没有什么“错”。如果没有别的,在我看来,它是如此复杂和不直观,以至于有设计的味道。对我来说,它不是不直观的,如果你看到了实际的类,你就会放心。它通过避免复制来优化OpenGL性能,并允许高度灵活的渲染管理层次结构。这还不足以诊断问题。同时使用调试器来确保列表
代码中的代码出现错误,我对此深表怀疑。提供一个测试用例来演示这个问题。因此我认为这种结构理论上没有问题,应该可以吗?只要知道我没有错过一些明显的东西就好了。我不会说没有什么“错”。如果没有别的,在我看来,它是如此复杂和不直观,以至于有设计的味道。对我来说,它不是不直观的,如果你看到了实际的类,你就会放心。它通过避免复制来优化OpenGL性能,并允许高度灵活的渲染管理层次结构。我将进一步研究我的代码,并发布我在这里找到的任何内容。啊,问题解决了-我调用了一个超类构造函数,它调用了在子类中重写的虚拟方法,但在子类构造函数中尚未创建重写的方法中所需的属性:)听起来不错。当您开始在复杂类中处理继承时,反引用null非常容易。很高兴你这么快就找到了:)好的,这是我想要的安慰,谢谢。我将进一步研究我的代码,并发布我在这里找到的任何内容。啊,问题解决了-我调用了一个超类构造函数,它调用了在子类中重写的虚拟方法,但在子类构造函数中尚未创建重写的方法中所需的属性:)听起来不错。当您开始在复杂类中处理继承时,反引用null非常容易。很高兴你这么快就找到了:)