سؤال

ليس لدي الكثير من الخبرة مع QT وتخرج هذه المشكلة اليوم.

QList<int> memList;
const int large = 100000;

getchar();
for (int i=0; i<large; i++)
{
    memList.append(i);
}

cout << memList.size() << endl;
getchar();

for (int i=0; i<large; i++)
{
    memList.removeLast();
}

cout << memList.size() << endl;
getchar();

بعد حلقة الأولى عندما أتحقق من استخدام الذاكرة، ترتفع، حيث يتم إلحاق العناصر الجديدة إلى memList ولكن بعد إزالةها في الحلقة الثانية يبقى استخدام الذاكرة في نفس المستوى. وأعتقد أن QList كان ديناميكيا وسوف تحرر الذاكرة عند إزالة العنصر. لذلك إما أن أفتقد شيئا (محتمل للغاية) أو أنها ليست هيكل ديناميكي. هل لديك أي أفكار كيفية جعلها تعمل؟

يعتبر

هل كانت مفيدة؟

المحلول

من مستندات يبدو أن هذا هو السلوك المتوقع:

لاحظ أن الصفيف الداخلي يزيد فقط على حياة القائمة. لا تقلص أبدا. يتم إلغاء تدمير الصفيف الداخلي من قبل المدمر ومشغل الواجب، عندما يتم تعيين قائمة واحدة إلى أخرى.

إذا كنت ترغب في إزالة الذاكرة التي حصلت عليها بضعة خيارات

  1. تأكد من استدعاء Destructor (باستخدام Delete {على افتراض أنك جديد القائمة في المكان الأول}، أو السماح لكائن Qlist بالخروج من النطاق)
  2. تعيين قائمة فارغة إلى قائمتك الكبيرة (أعتقد أن هذا سيعمل)

نصائح أخرى

أتذكر القراءة عن هذا:

http://cplusplus-soup.com/2010/01/05/freedelete-not-returning-memory-to-os/

يبدو أنه قد يكون له علاقة بسلوك تخصيص / حذف الذاكرة، لكنني لست متأكدا بنسبة 100٪.

qlist هو partway بين qvector. (مماثلة ل STD :: ناقل) و qlinkedlist. (مماثلة ل STD :: List). Qlist يحمل مجموعة من المؤشرات إلى الأشياء نفسها.

هذا المخطط يعني أن الفرز / إعادة ترتيب القائمة سريعة، لكن مخزن المؤشر ينمو بشكل مستمر حيث يتم إضافة العناصر (على غرار متجه). وبالتالي، فإن إزالة العناصر من القائمة يحرر الذاكرة المستخدمة من قبل العناصر، ولكن ليس المؤشر في الصفيف.

لاستعادة الذاكرة، تحتاج إلى إنشاء قائمة جديدة. وقد ضغط qvector () ولكن هذا لا يبدو موجودا في qlist.

ينصح QLEST لقوائم <1000 كائنات. إذا كنت بحاجة إلى التعامل مع القوائم الكبيرة جدا وتحتاج إلى الذاكرة المراد استصلاحها حيث يتم حذف الكائنات، فيجب عليك التفكير في استخدام QlinkedList.

جرب هذا الرمز إلى الذاكرة المجانية من QList

while( ! memList.isEmpty() )
    delete memList.takeFirst();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top