我用ATL做了个组件 CoCreateInstance后故意不Release。 VC.net2k3没有任何警告 怎么回事? 难道没有对ATL自动检查内存泄漏的功能?
解决方案 »
- DockControlBar(&m_MyToolBar)编译通过,运行崩溃
- 用mysql_real_query写到MYSQL里的数据,中文显示是乱码,求助。。。
- 判断图像中像素是否孤立点的函数
- 关于MapViewOfFile的问题。
- 使用ole嵌入自动化对象到一个单文档程序,如何使菜单及工具栏不被替换
- 初学者疑问:VC如何在console应用程序中使用COM啊
- 一个ftp程序源程序,编译时在link的时候过不去()高手帮帮我
- C++基础问题!对指针理解比较深的CSDN上的各位好手指点迷津
- 怎么用vc打开一个word窗口
- 一个钩子问题
- 怎样实现类似桌面快捷方式上类似修改某一快捷方式名字的功能,具体点说就是在一个绘图环境性下怎样能做到绘出一个区域来当键盘输入一个文
- 关于strcpy的编程
#ifdef _DEBUG
template<class T>
class CCheckObjrefT {
public:
class _ObjrefLock {
public:
_ObjrefLock() : m_nLock(0) { }
~_ObjrefLock() { _ASSERTE(m_nLock == 0); }
long Lock() { return InterlockedIncrement(&m_nLock); }
long Unlock() { return InterlockedDecrement(&m_nLock); }
private:
long m_nLock;
}; CCheckObjrefT() { GetLock()->Lock(); }
~CCheckObjrefT() { GetLock()->Unlock(); }
static _ObjrefLock* GetLock(){
static _ObjrefLock _lock;
return &_lock;
}
};
#define CHECKOBJREF(cls) CCheckObjrefT<cls> m_checkobjref##cls;
#else
#define CHECKOBJREF(cls)
#endif
这样,你每写一个class的时候,都加一个记录引用的成员即可,例如
class A
{
CHECKOBJREF(A);
};
如果某个class没有释放,CCheckObjrefT<T>::_ObjrefLock::~_ObjrefLock()函数里面的_ASSERTE()必然失败。
这个方法只能用于检验成员变量和局部变量,对全局变量不保障,因为根据C++参数堆栈规则(对全局变量谁先调用谁先构造,谁先进栈谁后出栈),如果A a是个全局变量或者静态变量的话,它在静态计数器构造之前建立,因此它在计数器的底部,所以计数器先在它之前先行释放了,所以在~A()后访问引用计数器就不是先前的值了。不过全局变量简单,一般不会因为全局变量而出现内存泄漏,因此我认为这就足够了。