ماذا يحدث عند محاولة مجانا() بالفعل تحرير الذاكرة في c ؟

StackOverflow https://stackoverflow.com/questions/135474

  •  02-07-2019
  •  | 
  •  

سؤال

على سبيل المثال:

char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE);
free(myString);
free(myString);

هل هناك أي آثار جانبية ضارة من فعل هذا ؟

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

المحلول

ها هو الفصل الآية.

إذا كانت الوسيطة [إلى free وظيفة] لا يطابق المؤشر في وقت سابق من إرجاعها من قبل calloc, malloc, أو realloc وظيفة, أو إذا كانت المساحة تم deallocated من دعوة إلى free أو realloc, سلوك غير معرف.(ISO 9899:1999 - لغات البرمجة — C, القسم 7.20.3.2)

نصائح أخرى

من لا شيء صامت الذاكرة الفساد ، أو تجزئة خطأ.

نعم, يمكنك الحصول على ضعف الحرة الخطأ أن يؤدي البرنامج إلى تحطم الطائرة.عليها أن تفعل مع malloc الداخلية هياكل البيانات لتتبع تخصيص الذاكرة.

الإجابة الموجزة:

نعم أشياء سيئة يمكن أن وربما لن يحدث.

لمنع هذا القيام:

free(myString);
myString = NULL;

علما أن جميع الإشارات إلى الذاكرة يجب أن يتم تعيين إلى NULL إذا كان الآخرون تم إنشاؤها.

كما يدعو free() مع NULL النتائج في أي عمل.للحصول على مزيد من المعلومات ، راجع: الرجل الحر

لا ذكي جدا.جوجل مزدوجة مجانا الضعف.تعيين المؤشر إلى NULL بعد تحرير لتجنب مثل هذه الأخطاء.

اعتمادا على أي نظام تشغيل ، لن يحدث شيء, البرنامج سوف تحطم الذاكرة سوف تكون تالفة أو أي عدد آخر من تأثيرات مثيرة للاهتمام.

دائما وضع المؤشر فارغة بعد تخليصه.فمن الأسلم أن محاولة مجانا مؤشر فارغة.

إنه يستحق الكتابة الحرة الخاصة بك المجمع للقيام بذلك تلقائيا.

أنه (يحتمل) يجعل الشياطين تخرج من أنفك.

لا تفعل ذلك.إذا كانت الذاكرة التي حصلت تحرير وإعادة تخصيصها إلى شيء آخر بين المكالمات free, ثم أشياء سوف تحصل على افسدت.

أشياء سيئة (TM)

حقا, أعتقد أنه غير معروف حتى أي شيء على الإطلاق بما في ذلك اللعب "حرب نووية عالمية" مع NORAD المركزية

قد تحطم البرنامج الذاكرة الفاسدة أو أخرى أكثر دهاء من الآثار السلبية.بعد حذف الذاكرة ، انها فكرة جيدة إلى تعيين إلى NULL (0).يحاول مؤشر فارغة لا يفعل شيئا ، وضمان أن تكون آمنة.نفس الشيء ينطبق على حذف في c++.

باختصار:"السلوك غير معرف".

(والآن ماذا يمكن أن تشمل و لماذا هذا هو الحال الآخرين قلت بالفعل.أنا فقط على الرغم من أنه تجدر الإشارة إلى المصطلح هنا كما هو شائع).

المسلم غريب الكلي أدناه هو مفيد تسقط في بديلا عن القضاء على عدة فئات من الثغرات الأمنية فضلا عن المساعدات التصحيح منذ يصل إلى الحرة()'d المناطق التي هي أكثر عرضة segfault بدلا من بصمت إفساد الذاكرة.

#define my_free(x) do { free(x); x = NULL; } while (0)

الحلقة دو حين هو مساعدة المحيطة رمز أكثر سهولة هضم متعددة البيانات.على سبيل المثالإذا (فعل) my_free(x) ؛

آخر حالة مثيرة للاهتمام:

char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE);
char * yourString = myString;

if (myString)
{
    free(myString);
    myString = NULL;
}
// Now this one is safe, because we keep to the rule for 
// setting pointers to NULL after deletion ...
if (myString)
{
    free(myString);
    myString = NULL;
}

// But what about this one:
if (yourString)
{
    free(yourString);
    yourString = NULL;
}

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