请注意以下代码:
Class Foo
class Foo:
{
public:
Foo();
~Foo();
}
C类
class C
{
public:
C();
~C();
void setA(A* a) { m_a = a; }
A* getA() { return m_a; }
private:
A* m_a;
}
抽象类A:
class A
{
public:
// Constructor, Destructor
A (C* c) : parent (c)
virtual ~A();
// Some RELEVANT pure abstract methods
void addFoo(Foo* f, std::string& id) = 0;
Foo* getFoo(std::string id)= 0;
protected:
C* parent;
std::map< std::string, Foo* > m_Foos;
};
在B.h
class B : public A
{
public:
// Constructor, Destructor ...
B(C* c);
virtual ~B();
// Definition of those pure RELEVANT methods
virtual void addFoo(Foo* f, std::string& id);
virtual Foo* getFoo(std::string id);
};
在B.cpp
// Some methods implementation ...
B::B(C* c) : A(c) { }
Foo* B::getFoo(std::string id)
{
return m_Foos[id];
}
B::setFoo( Foo* f, std::string& id )
{
m_Foos[id] = f;
}
然后,在代码的不同部分,一切运行顺利,直到我决定使m_Foos可继承:
C* c = new C();
c->setA(new B(c));
这在以前的执行中毫无疑问:
Foo* f = new Foo();
...
c->getA()->setFoo(f);
尝试访问setFoo中的m_Foos时程序崩溃。由于某些原因,我还不明白,m_Foos未在B中正确初始化(例如,运行m_Foos.size()返回疯狂值)。请注意,我在运行时遇到错误,而不是在编译时。
编辑:这很奇怪,因为在A类中添加另一个类型为int的受保护成员变量允许在B :: setFoo()中完美地修改和读取...
答案 0 :(得分:0)
我的通灵调试技巧告诉我,你的B
要么是空指针,要么实际已经构建,要么过早地被破坏。
您是否意外地在堆栈上创建了它并存储指针?
编辑:鉴于向A
添加成员会改变行为,代码中的某个地方肯定会进入未定义的行为。我们可能需要看到更多的代码来帮助更多的一般猜测。
答案 1 :(得分:0)
代码(有一些更正)对我有用。由于当你向A添加一些其他填充物时崩溃消失了,我相信你有内存损坏。尝试在A的构造函数中将填充符设置为已知值,并在到达崩溃位置时检查实际值。
除了验证其他地方发生了内存损坏之外,这实际上并没有帮助。