[ad_1]
لدي مصفوفة من CEdit*، إذا كانت هذه المصفوفة تحتوي على عناصر ليست فارغة فلا بد لي من حذفها.. لقد كتبت:
<pre>if (m_arEdit.GetSize() > 0) { for (int j = 0; j < m_arEdit.GetSize(); j++) if(m_arEdit[j] != NULL) delete m_arEdit[j]; //in this point software crashes because the element is NULL but it results not NULL }
ولكن عند تصحيح الأخطاء، يكون m_arEdit فارغًا للصف
if(m_arEdit[j] != NULL)
صحيح وتعطل البرامج..
ما حاولت:
حاولت كتابة الكود كما قلت ولكنه غير صحيح ولا أعرف السبب
الحل 2
أفترض أنك تتصل بهذا الرمز أكثر من مرة، وفي المرة الثانية تحاول القيام بذلك delete
إدخال تم حذفه بالفعل. يجب عليك تغيير الكود إلى:
for (int j = 0; j < m_arEdit.GetSize(); j++) { if(m_arEdit[j] != NULL) { delete m_arEdit[j]; m_arEdit[j] = NULL; // ensure this entry is not tried again } }
الحل 1
لقد مر وقت طويل منذ أن استخدمت MFC… لكن مشكلتك أبسط مما تعتقد: delete
يُستخدم لإعادة الذاكرة إلى الكومة، فلن يقوم بإزالة النص من عنصر تحكم CEdit.
ولهذا السبب يتعطل تطبيقك: لا يتم تخصيص جزء الذاكرة الذي تحاول حذفه بشكل منفصل new
فيرتبك النظام وينهار كل شيء.
بدلاً من delete
استخدم أساليب CEdit لإزالة سطر النص: فئة CEdit | مايكروسوفت تعلم[^]
وكأمر جانبي، لا تقم أبدًا بحذف العناصر من البداية – احذف دائمًا من النهاية وأعد العمل مرة أخرى.
لماذا؟ لسببين: أولاً، فإنه يزيل الكثير من النسخ غير الضروري، وثانيًا، يعني أنك تنظر إلى كل عنصر. إذا قمت بالحذف من البداية وكان هناك عنصران بجوار بعضهما البعض بحاجة إلى الإزالة، فإن إزالة العنصر الأول وزيادة الفهرس يعني أنك لا تنظر إلى الثاني.
سأفكر أيضًا مليًا فيما تفعله بالضبط: لماذا تقوم بإزالة كافة العناصر غير الفارغة؟ ألن يكون من المعقول أكثر إزالة كل شيء دفعة واحدة حيث سينتهي بك الأمر بعنصر تحكم “فارغ” في كلتا الحالتين؟
الحل 3
بناءً على إجابة ريتشارد، سأجري تغييرًا طفيفًا.
int size = m_arEdit.GetSize(); for (int j = size - 1; j >= 0; j--) { if(NULL != m_arEdit[j]) { delete m_arEdit[j]; m_arEdit[j] = NULL; } }
[ad_2]
コメント