在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
....这是怎么回事?

解决方案 »

  1.   

    首先,你new的语句出错:*pszBuffer = new TCHAR(nLen + 1);应该是*pszBuffer = new TCHAR[nLen + 1];然后,你delete的语句也不对: delete pszBuffer;应该是delete[] pszBuffer;
      

  2.   

    多谢leojay(leojay) 我不小心把[]写成()了!自己查了半天也没查出来!
    delete[]和delete有何区别?
    什么情况下使用delete[]?即我怎么知道我所要删除的内存对象是一个数组?但是在我的程序中,只要将new TCHAR(nLen + 1)改成new TCHAR[nLen + 1]就正确了!
    在删除该对象的时候使用delete[]或delete都没出现错误!这又是什么原因呢?
      

  3.   

    还有就是为什么写成new TCHAR(nLen + 1)编译也会通过?
    TCHAR又不是一个对象!???
      

  4.   

    TCHAR就是当然可以写成new TCHAR(nLen + 1),写new int(1)也没什么不妥吧?我觉得这里应该用delete,因为在main里面pszBuffer只是一个普通的TCHAR指针而不是指针数组。
      

  5.   

    int *n = new int(4);这时候n=4
    ()代表初始化
      

  6.   

    哎,小弟的水平让大家见笑了 :(那下面的代码为什么会出错? TCHAR* p = new TCHAR(20);
    _stprintf(p, TEXT("Hello!"));
    delete p; // 出错
    // delete[] p; 出错
      

  7.   

    TCHAR *p = new TCHAR(20);!!!!!!!
      

  8.   

    To darkpaladin(吟雪):
    当然应该用delete[],pszBuffer是一个指针,但这个指针是指向TCHAR型数组的。
    (当然,如果你new的时候写的是new TCHAR(...)的话,那是应该用delete而不是delete[],因为这时申请的就不是TCHAR型的数组了)
    To JerKii(Jack):
    分辨什么时候用delete什么时候用delete[]其实很简单:
    如果你申请内存的时候用的是new[]那么就用delete[],如:p = new int[...];
    如果你申请内存的时候用的是new,那么就用delete,如: p= new int;
      

  9.   

    To JerKii(Jack):
    我汗~~~,原来你还没搞清楚new TCHAR(20);跟new TCHAR[20];的区别啊?
    前者是申请一个TCHAR的变量,初值为20,而后者是申请一个长度为20的TCHAR数组。
      

  10.   

    为什么不写成int FormatNumeric(TCHAR* pszBuffer, int nLen, int nNumber)函数形式呢?
    将TCHAR** pszBuffer换成TCHAR* pszBuffer不是更清晰吗,二重指针看上去没有必要
      

  11.   

    TO:Jarrylogin(笨笨) 使用FormatNumeric(TCHAR* pszBuffer, int nLen, int nNumber)能确保所传入的pszBuffer已经正确初始化吗?用双指针当然有它的好处!大家绕了半天似乎都没有回答上我的问题!
    我的问题就是下面的代码为什么会出错?
    TCHAR* p = new TCHAR(20);
    _stprintf(p, TEXT("Hello!"));
    delete p; // 出错
    // delete[] p; 出错
      

  12.   

    当然出错了,_stprintf(p, TEXT("Hello!"))越界!
    TCHAR* p = new TCHAR(20);
    *p = 10;
    delete p; 
    就不会出错了
      

  13.   

    p只分配了一个TCHAR的空间
    硬往里面塞一个字符串,然后delete当然出错了
      

  14.   

    new TCHAR(20)只分配了一个TCHAR空间?那这里的20表示什么意思?是不是这样的写法根本没什么意义!
      

  15.   

    new TCHAR(20)是分配了一个TCHAR的空间,然后初始化为20
    在这里()是调用构造函数