تخصيص الذاكرة السيئة C ++ لمتجه
-
29-09-2019 - |
سؤال
أحصل على خطأ std_bad_alloc في الكود التالي. يبدو أن المشكلات هي عندما أضيف المصفوفة إلى المتجه ، ويتعطل البرنامج عندما أصل إلى هذا الخط في مصحح الأخطاء. المشكلة هي أنه يتم قراءة المصفوفتين الأولين فقط من الملف ، والآخران ليسا لأن البرنامج يتعطل مع الخطأ أعلاه.
المحلول
في أي مكان في مُنشئ النسخ ، يمكنك تعيين numcols ، numrows.
نصائح أخرى
ليس الإجابة على مشكلة التحطم (التي تم الاعتناء بها بالفعل على أي حال) ، ولكن تجدر الإشارة إلى أن مشغل المهمة الخاص بك يضيع بلا داع كما هو مكتوب حاليًا:
matrix matrix::operator =(const matrix right)
المشكلة الأولى هي أنها تأخذ المعلمة حسب القيمة. هذا بالطبع يعني أنه عندما مثل مهمة مثل A = B
يحدث ، ثم نسخة من B
مصنوع واستخدامه في right
معلمة الوظيفة. ولكن في الكود الحالي ، سيكون الغرض الوحيد من النسخ هو تعيين قيم A
ثم يتم تدميرها. يمكنك فقط تمرير أ const matrix&
لتجنب النسخة. (بدلاً من ذلك ، يمكنك ترك المعلمة كنسخة ذات قيمة ، ولكنها تنفذ المشغل بأكمله كملف نسخ و swap.)
القضية الثانية هي أن هذا يعود matrix
. قد يؤدي هذا أيضًا إلى إنشاء نسخة مؤقتة لا داعي لها. وعلى الرغم من أن المترجم قد يكون قادرًا على تحسين النسخة ، فلا يوجد غرض للعودة إلى نسخة قيمة على الإطلاق. يعيد النموذج القياسي لمشغل الواجب إشارة إلى الكائن الذي تم تعيينه إليه. لذلك يجب عليك المضي قدمًا وجعل هذا النوع A الإرجاع matrix&