Thread: 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