Обсуждение: I need help, about c++ pointer
Hi, all
I ceate some pointers with:
   SQLWCHAR** stmtlabels = m_srcodbc->GetResultColLabels();   m_curstmtlabels = new SQLWCHAR*[m_curstmtcolsnum];   for
(colidx=0;colidx<m_curstmtcolsnum; colidx++)       if (stmtlabels[colidx])       {           m_curstmtlabels[colidx] =
newSQLWCHAR[wcslen(stmtlabels[colidx])+1];           wcscpy(m_curstmtlabels[colidx], stmtlabels[colidx]);       }
else          m_curstmtlabels[colidx] = NULL;
 
delete them with:
   if (m_curstmtlabels)   {       SQLSMALLINT colidx;       for (colidx=0; colidx<m_curstmtcolsnum; colidx++)
if(m_curstmtlabels[colidx])               delete[] m_curstmtlabels;   }
 
When delete pointers, the first loop is ok.
But the sencond loop get a crash.
It seems the first loop delete second array too.
How to correct it?
BTW:
wcscpy, wcscmp, wcslen ... functions can be supported by all platforms?
Regards.
-----------------------------------------------
Quan Zongliang
quanzongliang@gmail.com
			
		Hi,
Le mercredi 15 juillet 2009 à 14:04:27, Quan Zongliang a écrit :
> [...]
> I ceate some pointers with:
>
>     SQLWCHAR** stmtlabels = m_srcodbc->GetResultColLabels();
>     m_curstmtlabels = new SQLWCHAR*[m_curstmtcolsnum];
>     for (colidx=0; colidx<m_curstmtcolsnum; colidx++)
>         if (stmtlabels[colidx])
>         {
>             m_curstmtlabels[colidx] = new
> SQLWCHAR[wcslen(stmtlabels[colidx])+1]; wcscpy(m_curstmtlabels[colidx],
> stmtlabels[colidx]);
>         }
>         else
>             m_curstmtlabels[colidx] = NULL;
>
> delete them with:
>
>     if (m_curstmtlabels)
>     {
>         SQLSMALLINT colidx;
>         for (colidx=0; colidx<m_curstmtcolsnum; colidx++)
>             if (m_curstmtlabels[colidx])
>                 delete[] m_curstmtlabels;
>     }
>
> When delete pointers, the first loop is ok.
> But the sencond loop get a crash.
> It seems the first loop delete second array too.
> How to correct it?
>
Shouldn't you do this?
if (m_curstmtlabels)
{ SQLSMALLINT colidx; for (colidx=0; colidx<m_curstmtcolsnum; colidx++)   if (m_curstmtlabels[colidx])     delete
m_curstmtlabels[colidx];
}
BTW, it would have been better on pgadmin-hackers :)
> BTW:
> wcscpy, wcscmp, wcslen ... functions can be supported by all platforms?
>
I suppose so, but I'm not really sure.
--
Guillaume.http://www.postgresqlfr.orghttp://dalibo.com
			
		> > delete[] m_curstmtlabels; It's really a stupid mistake. XD Thanks ----------------------------------------------- Quan Zongliang quanzongliang@gmail.com
Another pointer error.
ponters are created by:   int tablecount = 0;   SQLWCHAR **tabledata, ***tablelist;
   while (true)   {       sqlrc = SQLFetch(tableshstmt);       if (sqlrc != SQL_SUCCESS && sqlrc !=
SQL_SUCCESS_WITH_INFO)          break;
 
       if (m_dsnmaxcatnamelen)       {           SQLGetData(tableshstmt, 1, SQL_C_WCHAR, catname,
sizeof(SQLWCHAR)*m_dsnmaxcatnamelen,NULL);           catnameptr = new SQLWCHAR[wcslen(catname)+1];
wcscpy(catnameptr,catname);       }       else           catnameptr = NULL;
 
       if (m_dsnmaxschemnamelen)       {           SQLGetData(tableshstmt, 2, SQL_C_WCHAR, schemname,
sizeof(SQLWCHAR)*m_dsnmaxschemnamelen,NULL);           schemnameptr = new SQLWCHAR[wcslen(schemname)+1];
wcscpy(schemnameptr,schemname);       }       else           schemnameptr = NULL;
 
       SQLGetData(tableshstmt, 3, SQL_C_WCHAR, tablename, sizeof(SQLWCHAR)*m_dsnmaxtablenamelen, NULL);
tablenameptr= new SQLWCHAR[wcslen(tablename)+1];       wcscpy(tablenameptr, tablename);
 
       tabledata = new SQLWCHAR *[3];       tabledata[0] = catnameptr;       tabledata[1] = schemnameptr;
tabledata[2]= tablenameptr;
 
       tablelist = m_tablelist;       m_tablelist = new SQLWCHAR **[tablecount+1];       if (tablecount)
memcpy(m_tablelist,tablelist, sizeof(SQLWCHAR**)*tablecount);       m_tablelist[tablecount] = tabledata;       if
(tablelist)          delete[] tablelist;
 
       tablecount++;   }
   tablelist = m_tablelist;   m_tablelist = new SQLWCHAR **[tablecount+1];   if (tablecount)       memcpy(m_tablelist,
tablelist,sizeof(SQLWCHAR**)*tablecount);   m_tablelist[tablecount] = NULL;   if (tablelist)       delete[] tablelist;
 
(m_tablelist is defined in header file: SQLWCHAR ***m_tablelist)
Cleared by:   SQLWCHAR ***tablelist;   for (tablelist=m_tablelist; *tablelist; tablelist++)   {       if
((*tablelist)[0])          delete[] (*tablelist)[0];       if ((*tablelist)[1])           delete[] (*tablelist)[1];
 delete[] (*tablelist)[2];
 
       delete[] (*tablelist);   }
   delete[] m_tablelist;
When second lood try to delete pointer,
system said that memory seems has been deleted.
My pgsql test db has 21 tables,
when connect to it with ODBC I always get this error.
But a excel doc has 3 sheets(will be considered as 3 tables in ODBC driver)
no error occur.
-----------------------------------------------
Quan Zongliang
quanzongliang@gmail.com