在FormatNumeric函数中分配一块内存,并试图向该内存区域中写入相应的字符串,但现在遇到的问题就是:只要在该函数使用到了向该区域中写入字符串的函数后,在调用这种就不能把这块内存删除!
int FormatNumeric(TCHAR** pszBuffer, int nLen, int nNumber)
{ if (!*pszBuffer)
*pszBuffer = new TCHAR(nLen + 1);
// ZeroMemory(*pszBuffer, nLen + 1);
// _stprintf(*pszBuffer, szFormat, nNumber);
// _stprintf(*pszBuffer, TEXT("9"));
// _tcscpy(*pszBuffer, TEXT("dd"));
// *(*pszBuffer + 1) = 'G';
*(*pszBuffer + nLen) = '\0';
return lstrlen(*pszBuffer);
}int main(...)
{ ...
TCHAR *pszBuffer = NULL; //new TCHAR[10];
int l = FormatNumeric(&pszBuffer, 3, 8);
_tprintf(TEXT("%s len:%d\n"), pszBuffer, l);
delete pszBuffer;
...
}当在FormatNumeric函数中使用上被注释掉的任何一条语句后,再main函数中使用delete pszBuffer时就会出现:
Debug Error!
DAMAGE:after Normal block(#68) at 0x00371120
....这是怎么回事?
int FormatNumeric(TCHAR** pszBuffer, int nLen, int nNumber)
{ if (!*pszBuffer)
*pszBuffer = new TCHAR(nLen + 1);
// ZeroMemory(*pszBuffer, nLen + 1);
// _stprintf(*pszBuffer, szFormat, nNumber);
// _stprintf(*pszBuffer, TEXT("9"));
// _tcscpy(*pszBuffer, TEXT("dd"));
// *(*pszBuffer + 1) = 'G';
*(*pszBuffer + nLen) = '\0';
return lstrlen(*pszBuffer);
}int main(...)
{ ...
TCHAR *pszBuffer = NULL; //new TCHAR[10];
int l = FormatNumeric(&pszBuffer, 3, 8);
_tprintf(TEXT("%s len:%d\n"), pszBuffer, l);
delete pszBuffer;
...
}当在FormatNumeric函数中使用上被注释掉的任何一条语句后,再main函数中使用delete pszBuffer时就会出现:
Debug Error!
DAMAGE:after Normal block(#68) at 0x00371120
....这是怎么回事?
解决方案 »
- 请问如何通过按键调节滚动条的位置
- 如何在VC.NET2005的MFC程序中添加一个上下文相关菜单
- 如何让vc可执行程序始终位于屏幕最上方?
- 如何将xml的树型结构体现在CTreeCtl控件中?急!再线!
- 分配位图数据内存出错!!!困惑了两天都不知道是什么原因,分后来在加的。
- 请教一个匪夷所思的问题,非常简单,过来看看
- NTFS格式中怎样设置文件的摘要?
- 请问Vc中是否有,象Dephi中DirectoryListBox那样的控件。
- 如何才能在对话框里面加表格?可以是一个activeX控件.
- 补充:怎么会少“;”号呢?
- VC或TC的小闹钟的例子。
- 快来救命啊 怎么才能够恢复classview 信息????????
delete[]和delete有何区别?
什么情况下使用delete[]?即我怎么知道我所要删除的内存对象是一个数组?但是在我的程序中,只要将new TCHAR(nLen + 1)改成new TCHAR[nLen + 1]就正确了!
在删除该对象的时候使用delete[]或delete都没出现错误!这又是什么原因呢?
TCHAR又不是一个对象!???
()代表初始化
_stprintf(p, TEXT("Hello!"));
delete p; // 出错
// delete[] p; 出错
当然应该用delete[],pszBuffer是一个指针,但这个指针是指向TCHAR型数组的。
(当然,如果你new的时候写的是new TCHAR(...)的话,那是应该用delete而不是delete[],因为这时申请的就不是TCHAR型的数组了)
To JerKii(Jack):
分辨什么时候用delete什么时候用delete[]其实很简单:
如果你申请内存的时候用的是new[]那么就用delete[],如:p = new int[...];
如果你申请内存的时候用的是new,那么就用delete,如: p= new int;
我汗~~~,原来你还没搞清楚new TCHAR(20);跟new TCHAR[20];的区别啊?
前者是申请一个TCHAR的变量,初值为20,而后者是申请一个长度为20的TCHAR数组。
将TCHAR** pszBuffer换成TCHAR* pszBuffer不是更清晰吗,二重指针看上去没有必要
我的问题就是下面的代码为什么会出错?
TCHAR* p = new TCHAR(20);
_stprintf(p, TEXT("Hello!"));
delete p; // 出错
// delete[] p; 出错
TCHAR* p = new TCHAR(20);
*p = 10;
delete p;
就不会出错了
硬往里面塞一个字符串,然后delete当然出错了
在这里()是调用构造函数