سؤال

هل هذا جيد للقيام به في ج؟

int *i;
// do stuff

i = NULL;

i = (int *) some_func();
// do stuff

if (i != NULL)
    free(i);

i = NULL;

// do stuff
i = (int *) some_func();
// do stuff
if (i != NULL)
    free(i);

i = NULL;
هل كانت مفيدة؟

المحلول

1) هذا يعتمد على العقد الذي لديك مع some_func (). إذا كان Some_func يتوقع منك الاتصال بـ Free () على قيمة الإرجاع الخاصة به ، فسيكون الرمز الخاص بك على ما يرام.

2) لا بأس ، على الرغم من أنها ليست أنيقة بشكل رهيب ، لإعادة استخدام المتغيرات في C. من الأفضل عمومًا استخدام متغيرات مختلفة لأغراض مختلفة. من منظور الأداء والاستخدام ، فإنه نفس الشيء تمامًا.

نصائح أخرى

هذا يعتمد على ماذا some_func() هو فعل. إذا كانت تخصيص الذاكرة مع malloc(), ، ثم يجب عليك free() عندما تنتهي. إذا لم يكن الأمر كذلك ، فلا ينبغي عليك ذلك. ارجع إلى وثائق الوظيفة للتأكد.

سأقوم بإجابة إدغار الثانية ، ولكن لاحظ أيضًا أن اختبار NULL هنا غير ضروري:

if (i != NULL)
    free(i);

لأن الحرة (لاغية) مسموح بها.

الرمز الخاص بك يبدو على ما يرام - ما الشيء المحدد الذي تسأل عنه؟ ولكن لاحظ أنه إذا أدت الوظيفة إلى إرجاع int *، فليست هناك حاجة إلى طاقم ، وإذا لم يكن الأمر كذلك ، فربما لا تُعينها بـ int *.

حسنًا ، المشكلة الوحيدة التي أراها هي مشكلة قابلية القراءة غير المرتبطة فقط بـ C. لقد قمت بإعادة استخدام اسم متغير عدة مرات في كتلة واحدة أنه من الصعب حقًا معرفة ما هو المستخدم.

إذا قام Some_func بإرجاع مؤشر يشير إلى ذاكرة مخصصة ديناميكيًا ، نعم.

لا بأس طالما أن some_func () يفعل ما يفترض أن يفعله. إذا قام بتعيين عنوان غير صالح (غير معتمد) لـ I ، فسوف يتسبب ذلك في تعطل البرنامج.

يعتمد على عقد some_func ().

إذا قام Some_func () بتقديم بعض الذاكرة ويعينها مسؤوليتك في إطلاقها ، فعندئذ نعم ، من الجيد أن تحرر (). في الواقع ، إنه خطأ لا.

هذا هو واحد من Bugbears للعمل بلغة غير مُدارة ، يجب عليك تتبع الموارد التي تملكها وتأكد من إطلاقها.

إذا some_func() "يمتلك" بياناته ويعيد فقط المؤشرات لك لتفقده ، يجب ألا تحررها. لو أنه mallocS Dat فقط من أجلك ، فأنت مسؤول بالفعل عن القيام بـ free

في خطوتك الأولى

int *i;
// do stuff

i = NULL;

إذا أشرت إلى شيء مخصص للذاكرة ، فلن تضيع تلك الذاكرة إلى الأبد (تسرب الذاكرة)؟

فمثلا:

int *i;
i = (int*) malloc(sizeof(int);
i = NULL;

سوف تترك جزءا من الذاكرة حجم int اليسار تطفو في الأثير.

وينطبق الشيء نفسه على أمثلة some_func () ، لكنني أعتقد أنك تختبر بشكل صحيح محاولة تحرير كل ما تم تركه some_func (). خاصة إذا كنت لا تعرف كيف يعمل some_func ().

إذا كانت Some_func () من مكتبة ، فقد تكون هناك وظيفة free_some_func (i) التي من شأنها أن تقوم بالعمل نيابة عنك.

i = (int *) some_func();

أنت لم تقل ما نوع العودة من some_func() هو ، لكن (int *) الجزء مشبوه بعض الشيء. C يتساهى بشكل عام حول هذه الأشياء ، وعادة ما يجمع بشكل نظيف دون الحاجة إلى طاقم صريح. إذا لم يكن الأمر كذلك ، ففكر بعناية إذا كان ما تفعله محددًا جيدًا ومحمولًا كما تريد.

Kevin Montrose: hmmm.yeah ، مطالبة المبرمجين بأن يكونوا مؤهلين هو كسر صفقة حقيقية. ربما يجب أن نرتدي جميعًا خوذات أثناء حبنا ، فقط في حالة انخفاض السقف. وما هو "العقد" some_func? some_func إما إرجاع قيمة مناسبة للانتقال إلى مجانية ، أو لا. لا يوجد "عقد" هناك. لكن بعد ذلك ، أنا ضرطة قديمة ، ولا أؤمن بالتشويش على الفوز ببراوني مع الإدارة. هذه مفاهيم بسيطة.

CAF: ربما يكون هذا مترجمًا/معتمد من المكتبة. من الأكثر أمانًا أن تحقق كما يفعل. لمجرد أن تنفيذ عمليات الشيكات المجانية لمؤشر فارغ لا يعني أنهم جميعًا يفعلون ذلك.

إذا كنت تقصد هل من المقبول إعادة استخدام مؤشر int بدلاً من إعلانه جديد // do stuff يتكون من الكثير من الكود. قد يربط مبرمج آخر بشأن مكان *i جاء من ولماذا يعني x هنا و y هناك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top