栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

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

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

其一:

// CMyListCtrl.h
template
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
    void FreeAllItemsData();
......
}

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

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/954754.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号