Maison > développement back-end > C++ > Pourquoi le renvoi d'un tableau local en C génère-t-il un avertissement et comment puis-je le corriger à l'aide de « std :: vector » ?

Pourquoi le renvoi d'un tableau local en C génère-t-il un avertissement et comment puis-je le corriger à l'aide de « std :: vector » ?

Barbara Streisand
Libérer: 2024-12-02 17:04:10
original
578 Les gens l'ont consulté

Why Does Returning a Local Array in C   Generate a Warning, and How Can I Fix It Using `std::vector`?

Retour de tableau local : comprendre et éviter les avertissements en C

Considérez l'extrait de code suivant :

char *recvmsg(){
    char buffer[1024];
    return buffer;
}

int main(){
    char *reply = recvmsg();
    .....
}
Copier après la connexion

Ceci le code est destiné à récupérer un tableau de caractères via la fonction recvmsg(). Cependant, cela déclenche un avertissement :

warning C4172: returning address of local variable or temporary
Copier après la connexion

Cet avertissement indique que le retour de recvmsg() est l'adresse d'une variable locale, ce qui est inapproprié car la durée de vie de la variable se termine à la sortie de la fonction.

La solution : std::vector

Pour résoudre ce problème, une meilleure approche consiste à utiliser une bibliothèque standard conteneur, tel que std::vector. Cela offre plusieurs avantages :

  • Durée de vie étendue : La durée de vie d'un std::vector est gérée par le conteneur lui-même, garantissant que sa mémoire reste valide tout au long de l'exécution du programme.
  • Efficacité : Les vecteurs utilisent une allocation de mémoire contiguë, ce qui les rend efficaces pour le stockage et l'accès data.

Le code mis à jour à l'aide de std::vector ressemble à ceci :

std::vector<char> recvmsg()
{
    std::vector<char> buffer(1024);
    //..
    return buffer;
}
int main()
{
    std::vector<char> reply = recvmsg();
}
Copier après la connexion

Accès aux données de caractères :

Si vous Si vous avez besoin d'accéder aux données brutes de caractères du vecteur, vous pouvez utiliser :

void f(const char* data, size_t size) {}

f(&reply[0], reply.size());
Copier après la connexion

Cette méthode vous permet d'intégrer de manière transparente le vecteur avec C API ou API C qui attendent char*.

Éviter new :

Il est généralement recommandé de minimiser l'utilisation de new en C . En vous appuyant sur des conteneurs comme std::vector, vous évitez le besoin de gestion manuelle de la mémoire, réduisant ainsi les fuites de mémoire potentielles et améliorant la maintenabilité du code.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal