New et delete

Signaler
Messages postés
44
Date d'inscription
dimanche 25 novembre 2001
Statut
Membre
Dernière intervention
24 juillet 2010
-
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
-
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

Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
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]