2016-10-02 9 views
5

मैं इस तरह कोड लिख रहा हूँ:क्या पीआरटी = फ्री (पीआरटी) है, नल सुरक्षित है?

#include <stdlib.h> 

int main(void) 
{ 
    void *kilobyte; 
    kilobyte = malloc(1024); 
    kilobyte = NULL, free(kilobyte); 
    return 0; 
} 
समरूपता, जो अच्छा है के लिए

। लेकिन मैं किसी और से पहले यह मुहावरा का उपयोग कर कभी नहीं देखा है, तो मुझे आश्चर्य है अगर यह वास्तव में unportable/असुरक्षित हो सकता है, इस Wikipedia बोली के बावजूद:

In the C and C++ programming languages, the comma operator (represented by the token ,) is a binary operator that evaluates its first operand and discards the result, and then evaluates the second operand and returns this value (and type).


संपादित करें: आदेश को मिलाया। अब यह किसी भी चेतावनी के बिना gcc पर संकलित करता है।

+0

'फ्री' कोई मान वापस नहीं करता है, इस प्रकार रेखा खराब शैली है। कोड भी कम टाइपिंग नहीं है, मानक विचारधारा का उपयोग करें। – Olaf

+0

AFAIK, अल्पविराम ऑपरेटर 'मुक्त' मान को छोड़ देता है, जो 'शून्य' है, और इसके बजाय 'NULL' का उपयोग करता है। और यह ** ** कम टाइपिंग है यदि आपकी शैली लगातार उन्हें मुक्त करने के बाद पॉइंटर्स को एनयूएलएल असाइन करती है। –

+0

त्यागने के लिए कोई मूल्य नहीं है! क्या आप पूछने से पहले संकलित करने की कोशिश की? क्या आपको मानक में प्रमाण मिलता है कि यह कानूनी या अवैध है? कृपया अनुभाग उद्धृत करें। (ओह, और मैंने जीसीसी के साथ प्रयास किया)। – Olaf

उत्तर

11

ऐसा करने से:

kilobyte = NULL, free(kilobyte); 

आप एक स्मृति रिसाव है।

आपने kilobyte को न्यूल पर सेट किया है, इसलिए जो भी स्मृति इसे इंगित कर रही थी, अब कहीं भी संदर्भित नहीं है। फिर जब आप free(kilobyte) करते हैं, तो आप प्रभावी ढंग से free(NULL) कर रहे हैं जो कोई ऑपरेशन नहीं करता है।

free(NULL) के बारे में C standard से।

7.22.3.3 The free function

1.

#include <stdlib.h> 
void free(void *ptr); 

2. The free function causes the space pointed to by ptr to be deallocated, that is, made available for further allocation. If ptr is a null pointer, no action occurs. Otherwise, if the argument does not match a pointer earlier returned by a memory management function, or if the space has been deallocated by a call to free or realloc , the behavior is undefined.

संपादित करने से पहले अपने मूल कोड के लिए के रूप में:

kilobyte = free(kilobyte), NULL; 

इस के साथ समस्या यह = ऑपरेटर , ऑपरेटर की तुलना में अधिक पूर्वता है, तो इस बयान को प्रभावी ढंग से है:

(kilobyte = free(kilobyte)), NULL; 

यह एक चर सेट करने की कोशिश करता है void जिसकी अनुमति नहीं है।

kilobyte = (free(kilobyte), NULL); 

इस सूचक को मुक्त कर देते, तो शून्य करने के लिए सूचक सेट:

आप शायद करने के लिए इंडेंट क्या यह है।

टिप्पणी में ओलाफ से उल्लेख किया है, बल्कि एक पंक्ति में सब कुछ कर की तुलना में, यह बेहतर बजाय यह करने के लिए होगा:

free(kilobyte); 
kilobyte = NULL; 

ऐसा कुछ में कोड संघनक से पाठक को और अधिक स्पष्ट है दूसरों को समझ में नहीं आ रहा है, और (जैसा कि आपने देखा है) कम त्रुटि प्रवण है।

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