Initialiser const char * avec toutes les fuites de mémoire
Ci-dessous mon code d'exemple. C'est juste un exemple de ce qui est semblable au code que j'utilise dans mon application.
#define STR_SIZE 32
void someThirdPartyFunc(const char* someStr);
void getString(int Num, const char* myStr)
{
char tempStr[] = "MyTempString=";
int size = strlen(tempStr) + 2;
snprintf((char*)myStr, size, "%s%d", tempStr, Num);
}
int main()
{
const char * myStr = new char(STR_SIZE);
getString(1, myStr); //get the formated string by sending the number
someThirdPartyFunc(myStr); //send the string to the thirdpartyFunction
delete myStr;
return 0;
}
Je suis une exception, si j'utilise ce code. Je pense que le problème est avec la suppression de la "myStr". Mais supprimer est vraiment nécessaire.
Est-il un autre moyen pour le format de la chaîne dans getString et l'envoyer à l'ThirdPartyFunc??
Merci d'avance.
- Je ne suis pas sûr de ce que vous faites, mais pourquoi ne pas utiliser
std::string
à la place? - Pouvez-vous nous expliquer, pourquoi
+ 2
dansstrlen(tempStr) + 2
? - Pourquoi êtes-vous prendre
myStr
commeconst char*
, et puis le casting du const loin dans la fonction? - Je vous remercie. Je ne peux pas utiliser std::string :(.
Vous devez vous connecter pour publier un commentaire.
vous allouez pas un tableau de caractères, mais un char avec cette ligne:
et que l'on alloués char est initialisé avec la valeur de
STR_SIZE
, provoquant un "char" dépassement " dans ce cas.si vous voulez un tableau de taille
STR_SIZE
:(note rectangulaire [ ]). vous devez vous libérer de ces alloué partie de la mémoire à l'aide de la
delete[]
opérateur.note personnelle: le code que vous avez écrit ci-dessus (manuellement alloué cordes etc) est bonne éducation sage; vous ferez beaucoup de ces erreurs et ainsi apprendre à connaître les rouages du C /C++. pour la production de code, vous ne voulez pas que, pour la production de code que vous voulez
std::string
ou de l'autre de la chaîne-les contenants pour éviter la répétition de la chaîne des erreurs liées à la. en général, vous n'êtes pas celui qui a réussi à réinventer la façon dont la chaîne-les bibliothèques de travail. le même est vrai pour d'autres contenant des types comme dynamiquement cultivables-tableaux (std::vector
) ou de dictionnaire-types ou de quoi que ce soit. mais pour l'enseignement de bidouiller votre code ci-dessus sert une bonne cause.il y a d'autres problèmes dans votre extrait de code (remise
const char*
à une fonction et la modification de la ram, pas de calculer correctement lasize
paramètre lors de l'appel desnprintf
etc), mais ce ne sont pas liés à votre erreur de segmentation-problème.delete[]
pasdelete
.Re la technique, au lieu de
ne
Il est à noter que le problème est que la chaîne ne peut pas être modifié.
Mais vous seulement demandé au sujet de l'allocation/désallocation de problème.
Mais ensuite, il y a donc beaucoup de mal à des niveaux au-dessus de la langue technique.
Voici le code d'origine, complet:
Voici comment le faire en C++ niveau:
La
#define
disparu de la plus naturelle de code, mais notez que cela peut très facilement conduire à des conséquences indésirables texte de substitution, même avec toutes les majuscules des noms de macros. Et de crier en majuscules est une horreur de toute façon (c'est pourquoi c'est le nom de la macro convention, contrairement à certains autres de la convention). En C++, utilisez simplementconst
à la place.getString()
dans votre projet de code ainsi 🙂