Pourquoi est-ce QString à const char * conversion produisant un identifiant Debian sur Windows?

StackOverflow https://stackoverflow.com/questions/5837442

  •  27-10-2019
  •  | 
  •  

Question

Je suis en train d'envelopper libssh2 dans Qt, et ont le code suivant:

const char* username = inUsername.toLocal8Bit().data();
const char* password = inPass.toLocal8Bit().data();

Le problème est que le nom d'utilisateur et mot de passe ne se connecte pas au système. Pourquoi?

Parce que, selon le débogueur,

username  "5.1p1 Debian-6ubuntu2"
password  "5.1p1 Debian-6ubuntu2"

Ce ne sont pas les valeurs que j'ai donné le nom d'utilisateur ou mot de passe. J'ai essayé ToAscii, toLatin1 et annexant (ou non) le .data (). Pourtant, je reçois ces valeurs, au lieu des valeurs attendues. Je suis sous Windows, ce qui est pourquoi il est encore plus troublant, car, pour autant que je peux dire, rien que j'ai été compilé sur Debian ou Ubuntu.

Qu'est-ce qui se passe ici?

Était-ce utile?

La solution

Ce code:

const char* username = inUsername.toLocal8Bit().data();

est équivalent à ceci:

const char * username;
{
    const QByteArray l8b = inUsername.toLocal8Bit();
    username = l8b.data();
}

Est-ce que vous voyez ce qui se passe? Au moment où la déclaration a exécuté, le QByteArray temporaire a été supprimé par le compilateur à nouveau. Depuis data() renvoie seulement un pointeur vers le tampon de QByteArray interne, username maintenant des points à supprimer / mémoire libérée.

Pour résoudre le problème, faire username et password QByteArrays au lieu de const char*s, et l'utilisation username.data(), password.data() au lieu où vous avez utilisé username, password avant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top