stl map key 为指针时delete指针的问题

bingcaihuang 2013-06-06 03:26:29
代码如下:

struct cmp_str
{
bool operator()(const TCHAR *a, const TCHAR *b) const
{
return _tcscmp(a, b) < 0;
}
};

typedef std::map<const TCHAR*, int, cmp_str> TESTMAP

const TCHAR* ch1 = new TCHAR[_tcslen(_T("one")) + 1];
const TCHAR* ch2 = new TCHAR[_tcslen(_T("two")) + 1];
const TCHAR* ch3 = new TCHAR[_tcslen(_T("three")) + 1];
const TCHAR* ch4 = new TCHAR[_tcslen(_T("four")) + 1];
const TCHAR* ch5 = new TCHAR[_tcslen(_T("five")) + 1];

_tcsncpy(ch1, _T("one"), (_tcslen(_T("one")) + 1) * sizeof(TCHAR));
_tcsncpy(ch1, _T("two"), (_tcslen(_T("two")) + 1) * sizeof(TCHAR));
_tcsncpy(ch1, _T("three"), (_tcslen(_T("three")) + 1) * sizeof(TCHAR));
_tcsncpy(ch1, _T("four"), (_tcslen(_T("four")) + 1) * sizeof(TCHAR));
_tcsncpy(ch1, _T("five"), (_tcslen(_T("five")) + 1) * sizeof(TCHAR));

TESTMAP mapper;

mapper[ch1] = 1;
mapper[ch2] = 2;
mapper[ch3] = 3;
mapper[ch4] = 4;
mapper[ch5] = 5;

/* do what you want */

delete []ch1;
delete []ch2;
delete []ch3;
delete []ch4;
delete []ch5;



do what you want 以后想delete申请的内存,此时报错_CrtIsValidHeapPointer,难道key只能用string?不能用pointer?如果要释放这些内存该怎么处理啊?坐等高手指教
...全文
198 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
bingcaihuang 2013-06-06
  • 打赏
  • 举报
回复
引用 16 楼 dahaiI0 的回复:
跟map没关系,UNICODE下,_tcsncpy(ch1, _T("one"), (_tcslen(_T("one")) + 1) * sizeof(TCHAR));越界了
楼上正解,用memcpy就ok了……
dahaiI0 2013-06-06
  • 打赏
  • 举报
回复
跟map没关系,UNICODE下,_tcsncpy(ch1, _T("one"), (_tcslen(_T("one")) + 1) * sizeof(TCHAR));越界了
bingcaihuang 2013-06-06
  • 打赏
  • 举报
回复
引用 14 楼 williamx 的回复:
strncpy 的定义是这样的,第一个参数必须不能是const . char *strncpy(char *, const char *, size_t);
const也是拷贝代码过来的时候忘了抹掉的,搞不懂为何csdn发了贴不让编辑……
何哀何欢 2013-06-06
  • 打赏
  • 举报
回复
strncpy 的定义是这样的,第一个参数必须不能是const . char *strncpy(char *, const char *, size_t);
何哀何欢 2013-06-06
  • 打赏
  • 举报
回复
我这里没有windows环境,mac下没法编译,我比较好奇的是, 这个函数: _tcsncpy 居然可以给const char* 赋值? const TCHAR* ch1 = new TCHAR[_tcslen(_T("one")) + 1]; _tcsncpy(ch1, _T("one"), (_tcslen(_T("one")) + 1) * sizeof(TCHAR));
bingcaihuang 2013-06-06
  • 打赏
  • 举报
回复
引用 10 楼 williamx 的回复:
所以说,不要偷懒,能用 for()的地方尽量用 for
这里怎样用for?大哥……
bingcaihuang 2013-06-06
  • 打赏
  • 举报
回复
引用 8 楼 bingcaihuang 的回复:
[quote=引用 7 楼 williamx 的回复:] _tcsncpy(ch1, _T("one"), (_tcslen(_T("one")) + 1) * sizeof(TCHAR)); _tcsncpy(ch1, _T("two"), (_tcslen(_T("two")) + 1) * sizeof(TCHAR)); _tcsncpy(ch1, _T("three"), (_tcslen(_T("three")) + 1) * sizeof(TCHAR)); _tcsncpy(ch1, _T("four"), (_tcslen(_T("four")) + 1) * sizeof(TCHAR)); _tcsncpy(ch1, _T("five"), (_tcslen(_T("five")) + 1) * sizeof(TCHAR)); 别忘了,ch1只有4.你却乱赋值一通,当然内存泄漏了。
这个因为我写贴的时候忘记改了,源码是正确的,可是现在编辑不了帖子……[/quote] 还有在_tcsncpy(ch1, _T("one"), (_tcslen(_T("one")) + 1) * sizeof(TCHAR)); 前delete []ch1是没有问题的,拷贝以后delete就报错了……
何哀何欢 2013-06-06
  • 打赏
  • 举报
回复
所以说,不要偷懒,能用 for()的地方尽量用 for
bingcaihuang 2013-06-06
  • 打赏
  • 举报
回复
引用 7 楼 williamx 的回复:
_tcsncpy(ch1, _T("one"), (_tcslen(_T("one")) + 1) * sizeof(TCHAR)); _tcsncpy(ch1, _T("two"), (_tcslen(_T("two")) + 1) * sizeof(TCHAR)); _tcsncpy(ch1, _T("three"), (_tcslen(_T("three")) + 1) * sizeof(TCHAR)); _tcsncpy(ch1, _T("four"), (_tcslen(_T("four")) + 1) * sizeof(TCHAR)); _tcsncpy(ch1, _T("five"), (_tcslen(_T("five")) + 1) * sizeof(TCHAR)); 别忘了,ch1只有4.你却乱赋值一通,当然内存泄漏了。
还有在
bingcaihuang 2013-06-06
  • 打赏
  • 举报
回复
引用 7 楼 williamx 的回复:
_tcsncpy(ch1, _T("one"), (_tcslen(_T("one")) + 1) * sizeof(TCHAR)); _tcsncpy(ch1, _T("two"), (_tcslen(_T("two")) + 1) * sizeof(TCHAR)); _tcsncpy(ch1, _T("three"), (_tcslen(_T("three")) + 1) * sizeof(TCHAR)); _tcsncpy(ch1, _T("four"), (_tcslen(_T("four")) + 1) * sizeof(TCHAR)); _tcsncpy(ch1, _T("five"), (_tcslen(_T("five")) + 1) * sizeof(TCHAR)); 别忘了,ch1只有4.你却乱赋值一通,当然内存泄漏了。
这个因为我写贴的时候忘记改了,源码是正确的,可是现在编辑不了帖子……
何哀何欢 2013-06-06
  • 打赏
  • 举报
回复
_tcsncpy(ch1, _T("one"), (_tcslen(_T("one")) + 1) * sizeof(TCHAR)); _tcsncpy(ch1, _T("two"), (_tcslen(_T("two")) + 1) * sizeof(TCHAR)); _tcsncpy(ch1, _T("three"), (_tcslen(_T("three")) + 1) * sizeof(TCHAR)); _tcsncpy(ch1, _T("four"), (_tcslen(_T("four")) + 1) * sizeof(TCHAR)); _tcsncpy(ch1, _T("five"), (_tcslen(_T("five")) + 1) * sizeof(TCHAR)); 别忘了,ch1只有4.你却乱赋值一通,当然内存泄漏了。
bingcaihuang 2013-06-06
  • 打赏
  • 举报
回复
引用 5 楼 rocktyt2 的回复:
[quote=引用 4 楼 bingcaihuang 的回复:] [quote=引用 3 楼 rocktyt2 的回复:] map的key还是不要用指针比较好,问题很多 首先比较指针就肯定不是你想要的效果,需要自己定义比较函数
比较的问题上面已经定义了比较函数了,这个不是问题,主要是指针申请内存的释放问题,有解么?[/quote]必须在map析构完成后再释放 方案是有,不过…… 比如在使用map的代码外面再加一层大括号,释放放在大括号外[/quote] 不行,再加花括号在定义map前,出花括号map的生命周期结束后delete依然报这个错……
rocktyt 2013-06-06
  • 打赏
  • 举报
回复
引用 4 楼 bingcaihuang 的回复:
[quote=引用 3 楼 rocktyt2 的回复:] map的key还是不要用指针比较好,问题很多 首先比较指针就肯定不是你想要的效果,需要自己定义比较函数
比较的问题上面已经定义了比较函数了,这个不是问题,主要是指针申请内存的释放问题,有解么?[/quote]必须在map析构完成后再释放 方案是有,不过…… 比如在使用map的代码外面再加一层大括号,释放放在大括号外
bingcaihuang 2013-06-06
  • 打赏
  • 举报
回复
引用 3 楼 rocktyt2 的回复:
map的key还是不要用指针比较好,问题很多 首先比较指针就肯定不是你想要的效果,需要自己定义比较函数
比较的问题上面已经定义了比较函数了,这个不是问题,主要是指针申请内存的释放问题,有解么?
rocktyt 2013-06-06
  • 打赏
  • 举报
回复
map的key还是不要用指针比较好,问题很多 首先比较指针就肯定不是你想要的效果,需要自己定义比较函数
bingcaihuang 2013-06-06
  • 打赏
  • 举报
回复
引用 1 楼 mougaidong 的回复:
好多生面孔啊,这是在写跨平台的程序吗?
不是啊,普通的练习而已,求解……
turing-complete 2013-06-06
  • 打赏
  • 举报
回复
好多生面孔啊,这是在写跨平台的程序吗?

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧