读书人

为啥DELETE总是出错

发布时间: 2012-09-12 09:21:30 作者: rapoo

为什么DELETE总是出错
开始我以为因为COPYMEMORY的长度超过了原来申请的大小的时候才出错的
后来我把申请的空间变大,但是也是出错,为什么呢?

C/C++ code
    if( Str != NULL )    {        DWORD SourceLen = _tcslen( *Str );        DWORD InsertLen = _tcslen( &Text ) - 1;        TCHAR *TempStr = new TCHAR[ SourceLen + InsertLen + 100];        CopyMemory( TempStr,*Str,Location * sizeof(TCHAR) );        TempStr[ Location ] = Text;//[i - Location - 1];        CopyMemory( TempStr + (Location +1),*Str + Location + InsertLen,(SourceLen - Location - InsertLen + 1 ) * sizeof(TCHAR));                //TempStr[SourceLen + InsertLen + 1 ] = '\0';        delete [] *Str;        *Str = TempStr;    }


[解决办法]
DWORD SourceLen = _tcslen( *Str );
DWORD InsertLen = _tcslen( &Text ) - 1;
去红的
[解决办法]
问题叙述不清
[解决办法]
探讨

DWORD SourceLen = _tcslen( *Str );
DWORD InsertLen = _tcslen( &Text ) - 1;
去红的

[解决办法]
HRESULT InsertText( TCHAR **Str,DWORD Location,TCHAR Text )
如果是TCHAR Text :
那么传进来的就是一个字符,何来的长度?
如果是TCHAR *Text:
那么
DWORD InsertLen = _tcslen( &Text ) - 1;
就是错的。

[解决办法]
你应该把调用该函数时传递进来的Str是如何分配的代码贴出来才好判断!
[解决办法]
new 就是错的,还谈什么delete !
[解决办法]
HRESULT InsertText( TCHAR **Str,TCHAR *Text )
{
if( *Str != NULL )
{
DWORD SourceLen = _tcslen( *Str );// 因为 **
DWORD InsertLen = _tcslen( Text ) - 1;
afxDump << InsertLen << "\n";
//否则谁知道 InsertLen 是什么?
TCHAR *TempStr = new TCHAR[ SourceLen + InsertLen ];
_tcscpy( TempStr,*Str,InsertLen );
...
仔细看看



[解决办法]
DWORD InsertLen = _tcslen( Text );// - 1;

[解决办法]
给你改写了一个:
C/C++ code
char *InsertText(char *Src,int Loc,char *Insert){    if( Src != NULL )    {        DWORD SourceLen = _tcslen(Src);        DWORD InsertLen = _tcslen(Insert);        char *TempStr = new char[SourceLen + InsertLen];        strncpy(TempStr,Src,Loc);    strcpy(&TempStr[Loc],Insert);        strcpy(&TempStr[Loc+InsertLen],&Src[Loc]);//        return TempStr;    }//    return 0;}///////////// call://"ABCDE12345FGHIJ"char src[]="ABCDEFGHIJ";char ins[]="12345";char *pAll=InsertText(src,5,ins);delete []pAll; 

读书人网 >VC/MFC

热点推荐