怪事年年有,今年特别多啊。。。调试的问题……
我做个程序,有时在Debug下正常运行,在Release下屡屡出错。有时却又反过来……但是我在某个关键部位加了个MessageBox后又没事了,可我总不可能拉着MessageBox不放吧?
大家有什么好的调试经验,能启发一下我好吗?
程序代码:
class IFactoryObj
{
protected:
FactoryObj() {}
protected:
static void *createInstance(const char *pDataType);
};
// 根据不同的数据类型提示,进行实例的生成,并且封箱
// 举个例子,比如说有具体类A,需要用工厂生成
void *FactoryObj::createInstance(const char *pDataType)
{
if(!strcpy(pDataType, "Class_A"))
return (void *)(new A);
else
return NULL;
};
程序代码:
class FactoryA : public IFactoryObj
{
private:
FactoryA() {}
public:
static A *getInstance(); //这个函数就可以生成一个A对象的实例
static void ungetInstance(A *objA); // 这个函数用来撤销一个A对象的分配
};
// 这里我们实现这两个函数
A *FactoryA::getInstance()
{
return (A *)createInstance("Class_A");
}
void FactoryA::ungetInstance(A *objA)
{
if(objA)
delete A;
}
程序代码:
class B
{
public:
B();
virtual ~B(); // 开发提示,请不要在析构函数中直接书写大量的清理代码
protected:
virtual void dispose(); // 注意这个函数作为回收使用,虚方法使其派生后实现不同的清理方法
protected:
A *m_pA;
};
// 实现构造
B::B()
{
// 我们要为A对象分配空间
m_pA = FactoryA::getInstance(); // 好了,从工厂获得实例,不用担心数据类型的转换,因为他是属于A对象的工厂,所以工厂中的流水线只生产A。
}
// 实现析构
B::~B()
{
// 调用清理函数,好处是继承以后可以实现不同的清理效果
dispose();
}
// 实现清理函数
void B::dispose()
{
// 通过工厂销毁A对象,也就是客户将用旧的东西重新送回工厂进行销毁
FactoryA::ungetInstance(m_pA);
// 别忘了把指针置空,防止非法访问时内存违例
m_pA = NULL;
}
