لماذا يؤدي تحويل QString إلى const char* إلى إنتاج معرف دبيان على Windows؟
سؤال
أحاول تغليف libssh2 في Qt، ولدي الكود التالي:
const char* username = inUsername.toLocal8Bit().data();
const char* password = inPass.toLocal8Bit().data();
المشكلة هي أن اسم المستخدم وكلمة المرور لا يتصلان بالنظام.لماذا؟
لأنه، وفقا للمصحح،
username "5.1p1 Debian-6ubuntu2"
password "5.1p1 Debian-6ubuntu2"
هذه ليست القيم التي قدمتها لاسم المستخدم أو كلمة المرور.لقد حاولت toAscii وtoLatin1 وإلحاق (أو لا) .data().ومع ذلك، أحصل على هذه القيم، بدلاً من القيم المتوقعة.أنا أستخدم نظام التشغيل Windows، وهذا هو السبب في أن الأمر أكثر إثارة للقلق، لأنه، بقدر ما أستطيع أن أقول، لم يتم تجميع أي شيء على Debian أو Ubuntu.
ما الذي يحدث هنا؟
المحلول
هذا الرمز:
const char* username = inUsername.toLocal8Bit().data();
يعادل هذا:
const char * username;
{
const QByteArray l8b = inUsername.toLocal8Bit();
username = l8b.data();
}
هل ترى ما يحدث؟بحلول الوقت الذي يتم فيه تنفيذ البيان، يكون المؤقت QByteArray
تم حذفه بواسطة المترجم مرة أخرى.منذ data()
يقوم فقط بإرجاع المؤشر إلى الجزء الداخلي QByteArray
متعادل، username
يشير الآن إلى الذاكرة المحذوفة/المحررة.
لحل المشكلة، اصنع username
و password
QByteArray
س بدلا من const char*
س، واستخدام username.data()
, password.data()
بدلا من ذلك حيث استخدمته username
, password
قبل.