New et delete

Larwin Messages postés 44 Date d'inscription dimanche 25 novembre 2001 Statut Membre Dernière intervention 24 juillet 2010 - 12 févr. 2010 à 16:57
cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 - 12 févr. 2010 à 23:43
bonjour a tous,
je viens d'écrire une petite fonction mais celle ci me pose problème lors de la libération de variable...

la voici :

BOOL splitString (vector<wstring> & tokenArray, wstring & stringToSplit, const wchar_t *delimiter){
wchar_t *localStringCopy = NULL;
localStringCopy = new wchar_t[stringToSplit.size()];
wcscpy(localStringCopy, stringToSplit.c_str());
wchar_t *currentToken;
for (currentToken = wcstok(localStringCopy, delimiter); currentToken != NULL; currentToken = wcstok(NULL, delimiter)){
tokenArray.push_back(wstring(currentToken));}
delete[] localStringCopy;
return true;
}

le "delete[] localStringCopy;" plante, je me doute que la fonction wcstok y soit pour quelque chose mais je seche..., je suis vraiment obligé de la delete cette variable ? a la sortie de ma fonction le systeme s'en chargera t'il tout seul ?

Merci d'avance

1 réponse

cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 124
12 févr. 2010 à 23:43
Chez moi, j'ai repris ta fonction, et ça fonctionne avec quelques légères modifications (splitString). Néanmoins valgrind n'aime pas du tout (c'est un vérificateur mémoire). En effet, la fonction wcstok est éviter en C++ (on ne mélange pas C et C++).

Je t'ai mis une version full C++ qui est plus adaptée (et qui gère les délimiteurs multiples).

Quelques autres remarques:
- Jamais de using namespace std, voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
- Pas besoin d'utiliser NULL, préfère 0, voir: http://0217021.free.fr/portfolio/axel.berardino/articles/null-en-cpp

#include 
#include <vector>

bool splitString(std::vector<std::wstring>& tokenArray,
 const std::wstring& stringToSplit,
 const wchar_t* delimiter)
{
  wchar_t* localStringCopy = 0;
  wchar_t* errorCallBack = 0;

  localStringCopy = new wchar_t[stringToSplit.size() + 1];
  wcscpy(localStringCopy, stringToSplit.c_str());
  localStringCopy[stringToSplit.size()] = 0;
  for (const wchar_t* currentToken = wcstok(localStringCopy, delimiter, &errorCallBack);
       currentToken != 0;
       currentToken = wcstok(0, delimiter, &errorCallBack)
       )
  {
    tokenArray.push_back(currentToken);
  }

  delete[] localStringCopy;

  return true;
}

void display(const std::vector<std::wstring>& tab)
{
  typedef std::vector<std::wstring>::const_iterator iter;

  const iter end = tab.end();
  for (iter it = tab.begin(); it != end; ++it)
    std::wcout << *it << std::endl;
}

void splitStringCpp(std::vector<std::wstring>& tokens,
    const std::wstring& str,
    const std::wstring& delimiters)
{
  std::wstring::size_type lastPos = str.find_first_not_of(delimiters, 0);
  std::wstring::size_type pos = str.find_first_of(delimiters, lastPos);

  while (std::wstring::npos != pos || std::wstring::npos != lastPos)
  {
    tokens.push_back(str.substr(lastPos, pos - lastPos));
    lastPos = str.find_first_not_of(delimiters, pos);
    pos = str.find_first_of(delimiters, lastPos);
  }
}


int main()
{
  const std::wstring s = L"Kikoo toto tutu tata";

  //   const wchar_t c = L' ';
  //   std::vector<std::wstring> tab;
  //   splitString(tab, s, &c);
  //   display(tab);

  const std::wstring delimiters = L" ";
  std::vector<std::wstring> tabCpp;
  splitStringCpp(tabCpp, s, delimiters);
  display(tabCpp);

  return 0;
}


_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
0