سؤال

غالبًا ما أستخدم موقع الويب www.cplusplus.com كمرجع عند كتابة كود C.

كنت أقرأ المثال المذكور في الصفحة لـ فريد وكان لديه سؤال.

على سبيل المثال ينشرون:

/* fread example: read a complete file */
#include <stdio.h>
#include <stdlib.h>

int main () {
  FILE * pFile;
  long lSize;
  char * buffer;
  size_t result;

  pFile = fopen ( "myfile.bin" , "rb" );
  if (pFile==NULL) {fputs ("File error",stderr); exit (1);}

  // obtain file size:
  fseek (pFile , 0 , SEEK_END);
  lSize = ftell (pFile);
  rewind (pFile);

  // allocate memory to contain the whole file:
  buffer = (char*) malloc (sizeof(char)*lSize);
  if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}

  // copy the file into the buffer:
  result = fread (buffer,1,lSize,pFile);
  if (result != lSize) {fputs ("Reading error",stderr); exit (3);}

  /* the whole file is now loaded in the memory buffer. */

  // terminate
  fclose (pFile);
  free (buffer);
  return 0;
}

يبدو لي أنه إذا كانت النتيجة != lSize، فلن يتم استدعاء free(buffer) أبدًا.هل سيكون هذا تسربًا للذاكرة في هذا المثال؟

لقد اعتقدت دائمًا أن الأمثلة الموجودة على موقعهم ذات جودة عالية جدًا.ربما لا أفهم بشكل صحيح؟

هل كانت مفيدة؟

المحلول

ولن يكون تسرب الذاكرة في هذا المثال ، لإنهاء البرنامج (عن طريق الاتصال exit()) تفرج عن الذاكرة المرتبطة به.

ومع ذلك، فإنه سيكون من تسرب الذاكرة إذا كنت تستخدم هذه القطعة من التعليمات البرمجية كما روتين ودعا شيء من هذا القبيل return 1; في مكان exit().

نصائح أخرى

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

في برنامج أكثر تعقيدا، وهذا ربما يكون مشكلة حقيقية. المفقودين مجانا من شأنه أن يخلق تسرب الذاكرة وان fclose المفقودين يسبب تسرب الموارد.

ونظام التشغيل حتى ينظف أي ذاكرة unfreed من خلال عملية عند إغلاق تلك العملية. على الأقل، <م> الحديثة أنظمة التشغيل القيام به.

إذا البرنامج لم تخرج في النتيجة نقطة = lSize، وهذا هو، واصلت مع بعض الطريق الآخر التنفيذ، ثم نعم -!. بل هو تسرب الذاكرة مضمونة

وهناك نوعان من مسارات محتملة.

و(1) ينتج = lSize - في هذه الحالة، الخروج (0) ويسمى. هذا يقتل العملية وسوف نظام التشغيل تنظيف الذاكرة.

و(2) نتيجة == lsize - في هذه الحالة، يتم تحرير المخزن المؤقت صراحة، ولكن يسمى عودة الحق بعد ذلك حتى مجانا هي النمط الغالب مجرد جيدة لأن هذا يقتل أيضا عملية ونظام التشغيل سوف، مرة أخرى، نظيفة حتى الذاكرة.

وحتى في هذه الحالة بسيطة، لا يوجد أي تسرب للذاكرة. ولكن ربما هو ممارسة جيدة لفقط للتأكد من أنك تحرير أي الذاكرة كنت قد خصصت في أي تطبيق تكتب. سوف يحصل في هذه العادة منع الكثير من الصداع بالنسبة لك في المستقبل.

أما بالنسبة لاحتمال تسرب الذاكرة، فقد أجاب الآخرون بالفعل على هذا السؤال.منذ فترة، قمت بنشر نسخة مختلفة من الكود المحدد يجب التعامل مع جميع حالات الخطأ المحتملة بشكل صحيح:

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