سؤال

وبالنظر إلى مؤشر إلى بعض متغير..هل هناك طريقة للتحقق ما إذا كان بشكل ثابت أو حيوي تخصيص??

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

المحلول

اقتباس من تعليقك:

im مما يجعل الطريقة التي سوف الأساس التخلص من البنية.أنه يحتوي على بيانات الأعضاء التي هي مؤشر إلى شيء التي قد تكون أو لا تكون malloced..اعتمادا على أي واحد ، أود أن تحريرها

الطريقة الصحيحة لإضافة آخر عضو البنية:مؤشر إلى deallocation وظيفة.

ليس فقط ثابت مقابل التخصيص الديناميكي.هناك عدة ممكن allocators ، malloc() هو واحد فقط.

على يونكس مثل أنظمة يمكن أن يكون:

  • متغير ثابت
  • على المكدس
  • على المكدس ولكن تخصيصها (أي alloca())
  • على كومة المخصص لها malloc()
  • على كومة المخصص لها new
  • على كومة في وسط مجموعة المخصصة مع new[]
  • على كومة من داخل البنية المخصصة مع malloc()
  • على كومة من داخل قاعدة الفئة من كائن المخصصة مع new
  • تخصيص مع mmap
  • تخصيص مع العرف مخصص
  • العديد من الخيارات بما في ذلك العديد من تركيبات الاختلافات المذكورة أعلاه

على ويندوز ، لديك أيضا عدة أوقات التشغيل ، LocalAlloc, GlobalAlloc, HeapAlloc (مع عدة أكوام التي يمكنك بسهولة خلق), وهلم جرا.

يجب عليك دائما الإفراج عن الذاكرة مع تصحيح وظيفة الإفراج عن مخصص يمكنك استخدامها.لذا إما جزء من برنامج المسؤولية عن تخصيص الذاكرة أيضا مجانا الذاكرة ، أو يجب أن يمر الصحيح الإفراج عن وظيفة (أو التفاف حول ذلك) إلى الكود الذي سوف يحرر الذاكرة.

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

ريمون تشن لديه بلوق وظيفة حول هذا الموضوع (ويندوز تتمحور, ولكن المفاهيم هي نفسها في كل مكان): تخصيص وتحرير الذاكرة عبر وحدة حدود

نصائح أخرى

ACE يفعل هذا في كل مكان. قد تكون قادرة على التحقق كيف تفعل ذلك. بشكل عام ربما كنت لا ينبغي عليك القيام به هذا في المقام الأول على الرغم من ...

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

ومعظم LIBC تطبيقات malloc عمل عن طريق تخزين رأس قبل كل كتلة الذاكرة التي عادت بها حقول (لاستخدامها من قبل الدعوة مجانا ()) التي لديها معلومات عن حجم الكتلة، فضلا عن قيمة 'سحر'. هذه القيمة السحرية للحماية من المستخدم حذف عن طريق الخطأ مؤشر الذي لم يكن alloc'd (أو عتق كتلة التي تم تجاوزها من قبل المستخدم). انها نظام محدد جدا لذلك كنت أن ننظر إلى تنفيذ مكتبة LIBC لمعرفة بالضبط ما كانت قيمة سحرية هناك.

وبمجرد أن تعرف ذلك، يمكنك تحريك المؤشر نظرا إلى نقطة في الرأس ومن ثم التحقق من ذلك لقيمة سحرية.

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

وليس كميزة قياسية.
قد يكون للإصدار تصحيح مكتبة malloc بك بعض من وظيفة للقيام بذلك.

ويمكنك مقارنة عنوانه إلى شيء تعرفه لتكون ثابتة، ويقولون انها malloced فقط لو كان بعيدا، إذا كنت تعرف نطاق يجب أن تكون قادمة من، ولكن إذا نطاقه غير معروف، لا يمكنك الثقة حقا أن.

1) الحصول على ملف الخريطة للحصول على رمز يو.

.

و2) يجب أن يكون الكامنة الأساسي الهدف عملية / الأجهزة ملف الذاكرة خريطة مما يدل عادة - عنوان الذاكرة البداية (كومة، كومة، global0، وحجم تلك الكتلة، سمات تلك الكتلة ذاكرة الكتابة للقراءة

و3) بعد الحصول على عنوان الكائن (مؤشر متغير) من ملف ماو في 1.) في محاولة لمعرفة أي منع هذا العنوان يقع في. ش يمكن الحصول على بعض الفكرة.

و= AD

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