怪事年年有,今年特别多啊。。。调试的问题……
我做个程序,有时在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; }