Обсуждение: I need help, about c++ pointer

Поиск
Список
Период
Сортировка

I need help, about c++ pointer

От
Quan Zongliang
Дата:
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



Re: I need help, about c++ pointer

От
Guillaume Lelarge
Дата:
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


Re: I need help, about c++ pointer

От
Quan Zongliang
Дата:
> >                 delete[] m_curstmtlabels;

It's really a stupid mistake. XD
Thanks

-----------------------------------------------
Quan Zongliang
quanzongliang@gmail.com



Re: I need help, about c++ pointer

От
Quan Zongliang
Дата:
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