لماذا يؤدي تحويل QString إلى const char* إلى إنتاج معرف دبيان على Windows؟

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

  •  27-10-2019
  •  | 
  •  

سؤال

أحاول تغليف 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 قبل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top