2012-10-29 7 views
5

मेरा कोड त्रुटि के बिना संकलित करता है, लेकिन इसका क्या अर्थ है?सी ++; संकलन के दौरान "डिफ़ॉल्ट रूप से सक्षम" चेतावनी क्या है?

etherate.cpp:432:11: warning: deleting array ‘unsigned char broadMAC [6]’ [enabled by default] 

इस लाइन से, जहां मैं एक हस्ताक्षरित चार सरणी हटा रहा हूं;

delete [] broadMAC; 

क्या यह छोड़ना ठीक है, अगर नहीं, तो मैं इस पर कैसे सुधार कर सकता हूं?

धन्यवाद।

अद्यतन

कैसे broadMAC घोषित किया जाता है?

पिछली 10 लाइनों से;

unsigned char broadMAC[6] = {destMAC[0], destMAC[1], destMAC[2], destMAC[3], destMAC[4], destMAC[5]}; 

destMAC भी इसके अंदर संग्रहीत मूल्यों के साथ एक हस्ताक्षरित चार सरणी है। मुझे उन्हें कॉपी करने की आवश्यकता है, destMAC के साथ कुछ करें, फिर मूल मानों को पुनर्स्थापित करें; तो मैंने ब्रॉडमैक घोषित कर दिया है और इसे बाद में हटाना चाहता हूं।

+0

कैसे broadMAC है घोषित? –

+0

अच्छा बिंदु, मैं इसे जोड़ दूंगा! – jwbensley

+0

अच्छी तरह से, यह अब स्पष्ट है: ल्यूचियन के उत्तर –

उत्तर

2

जी ++ कमांड लाइन पर निर्दिष्ट करके कई चेतावनियों को सक्षम और अक्षम करने की अनुमति देता है (उदा। -Wctor-dtor-privacy, -Woverloaded-virtual, -W...)। कुछ चेतावनियां सक्षम हैं, कमांड लाइन पर ऐसा करने की आवश्यकता के बिना, दूसरों को स्पष्ट रूप से अनुरोध किया जाना चाहिए।

तो, कुछ चेतावनी है:

"डिफ़ॉल्ट रूप से सक्षम" और कुछ कर रहे हैं:

"डिफ़ॉल्ट रूप से अक्षम"

+0

मुझे यकीन नहीं है कि यह कभी भी "डिफ़ॉल्ट रूप से अक्षम" कहता है। इसके बजाय, सामान्य रूप से अक्षम विकल्पों के लिए, संकलक * विकल्प के * नाम को मुद्रित करेगा जो प्रश्न में नैदानिक ​​के प्रदर्शन को नियंत्रित करता है। यदि आप संकलक को इसके बारे में बताना नहीं चाहते हैं, तो संकलित करते समय '-फनो-डायग्नोस्टिक्स-शो-विकल्प' विकल्प का उपयोग करें। –

+0

"डिफॉल्ट द्वारा सक्षम" का वर्णन करने के बिना यह इंगित किए बिना कि कोड अपरिभाषित व्यवहार का आह्वान करता है, वह थोड़ा सा शाब्दिक उत्तर हो सकता है। :) – Yakk

+1

@Yakk जब मैंने अपना जवाब लिखा, लूचियन ग्रिगोर ने पहले से ही कमियों के लिए एक सही उत्तर प्रदान किया। तो, उनके काम को डुप्लिकेट करने में कोई बात नहीं थी। –

13

broadMAC, स्वत: स्मृति में आवंटित किया जाता है तो जैसे:

unsigned char broadMAC[6]; 

और फिर आप

delete[] broadMAC; 

जो गलत है कहते हैं, क्योंकि आप इसे new[] साथ आवंटित नहीं किया।

का उपयोग delete/delete[] स्मृति पर साथ new/new[] परिणाम अपरिभाषित व्यवहार में आवंटित नहीं किया, और अपने संकलक बहुत चालाक इस मामले में बताने के लिए है।

आपको स्मृति को मुक्त करने की चिंता करने की आवश्यकता नहीं है, इसे स्वचालित रूप से मुक्त कर दिया जाएगा।

+0

धन्यवाद चेतावनी का सटीक रूप नहीं पता है @ लुचियन ग्रिगोर, यह कुछ अच्छी जानकारी है! मैं वास्तव में "डिफ़ॉल्ट रूप से सक्षम" संदेश से अधिक उलझन में था लेकिन यह जानने के लिए अभी भी महत्वपूर्ण है कि मेरे कंपाइलर को संदेश कैप्चर करने और उत्पन्न करने के कारण, और इसे कैसे कम किया जाए, तो धन्यवाद! +1 – jwbensley

2

आप एक सरणी को खाली करने की कोशिश कर रहे हैं जिसे आपने ढेर में आवंटित किया है, ढेर नहीं। तो जब चर का दायरा समाप्त हो जाता है, तो यह खुद को मुक्त कर देगा और आपको इसे स्पष्ट रूप से मुक्त नहीं किया जाना चाहिए।

+0

हाय @ जोसेफ, कृपया मेरी टिप्पणी लुचियान ग्रिगोर को देखें, यही कारण है कि मैंने ओलाफ डायत्शे को सही के रूप में चिह्नित किया, लेकिन फिर भी, कुछ अच्छे ज्ञान के लिए भी धन्यवाद! :) – jwbensley

संबंधित मुद्दे