C++模板(template)使用注意事项(error LNK2019: 无法解析的外部符号)

通常写模板类都是在类定义里面来实现,一个头文件(.h)包含所有定义和声明代码。今天调试程序中无意识的发现程序有内存泄漏,原来是CListCtrl在使用过程中,节点关联了数据指针,以前都是在控件窗体销毁事件里面进行数据释放处理,但是发现每次释放都得在销毁事件里面进行处理非常麻烦,有没有简单点的处理方式呢?我就想窗体销毁的时候,控件也会要销毁的,于是想在控件销毁里面顺带吧节点数据也给销毁,这样是不是就省事很多呢?这样做确实省事方便了很多。由于我不想关心节点所关联的数据类型,于是获取节点数据,返回值类型统一采用LPVOID进行处理,但是调试发现,数据释放不完全,还是存在内存泄漏,原因是如果关联的数据类型结构体大小超过4字节(LPVOID对应的是地址位偏移+1字节大小为4字节),那么超过4字节部分的内存将不会被释放,于是我想将结构体信息传递给CListCtrl,我需要关心用到的函数接口其实只有一个FreeAllItemsData();实现方法有2种:

其一:

// CMyListCtrl.h
template<typename T>
class CMyListCtrl : public CListCtrl
{
......
    void FreeAllItemsData();
......
}

// CMyListCtrl.cpp
void CMyListCtrl::FreeAllItemData()
{
	HTREEITEM hRoot = GetRootItem();
	T* pData = (T*)GetItemData(hItem);
 	if (pData)
 	{
 		delete pData;
        pData = NULL;
 	}
}

其二:

// CMyListCtrl.h
class CMyListCtrl : public CListCtrl
{
......
    emplate<typename T>
    void FreeAllItemsData();
......
}

// CMyListCtrl.cpp
emplate<typename T>
void CMyListCtrl::FreeAllItemData()
{
	HTREEITEM hRoot = GetRootItem();
	T* pData = (T*)GetItemData(hItem);
 	if (pData)
 	{
 		delete pData;
        pData = NULL;
 	}
}

编译的时候发现问题来了,出现了很多这种错误,几乎全是调用FreeAllItemsData的地方。

按照常规思路,我单独将函数FreeAllItemData实现代码放到了CMyListCtrl.h里面来实现,完美解决了这种低级错误。

猜你喜欢

转载自blog.csdn.net/u012156872/article/details/107020626
今日推荐