संपादन हटाने में समस्या


मेरे पास CEdit* की एक सरणी है, यदि इस सरणी में ऐसे तत्व हैं जो शून्य नहीं हैं तो मुझे इन्हें हटाना होगा..मैंने लिखा:

सी++
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

मुझे एमएफसी का उपयोग किए हुए काफी समय हो गया है… लेकिन आपकी समस्या आपके विचार से कहीं अधिक सरल है: 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;
    }
}

コメント

タイトルとURLをコピーしました