首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

大家幫小弟我看一下為何用new-delete這裡會出錯呢

2012-02-20 
大家幫我看一下為何用new-delete這裡會出錯呢?voidmain(){LPCWSTRstr_T( UnicodeString )char*pnewch

大家幫我看一下為何用new-delete這裡會出錯呢?
void   main()
{
    LPCWSTR     str   =   _T( "UnicodeString ");
    char   *p   =   new   char[13];
    memset(p,   0,   13);
    WideToChar(str,   p);
    delete   []   p;         <----錯誤在這裡出現
}

int   WideToChar(LPCWSTRpWide,LPSTRpChar)
{
int   len   =   ::WideCharToMultiByte(   CP_ACP,   0,   pWide,   -1,pChar,                                                                 0,   NULL,   NULL);
int   iConvert   =   ::WideCharToMultiByte(   CP_ACP,   0,   pWide,   -1,pChar,len,   NULL,   NULL);
returniConvert;
}

WideToChar是我自己寫的函數,   用來將Unicode轉化為AnsiString的,   為什麼經過這句函數後再刪除內存就會出錯呢?實在不理解,   請大家指教.


[解决办法]
基本你可以这样理解:
你new了13个字节的内存.编译器在堆上就分配13个字节的内存给你,同时还会在后(或者是前),写一个字节(或者几个字节,也忘了)的标志位,来记录你申请的长度.

而你实际写了14字节,就可能覆盖掉了标志位,然后系统回收堆内存的时候按你改写的标志位来回收内存,谁也不知道会把那些有用的内存给回收了,于是就崩溃了.

大概是这个样子吧,记得写的时候不要超过你申请的长度就行了.

热点排行