[عزف الموسيقى]
>> DOUG لويد: OK ذلك اقتراح قبل البدء هنا.
إذا لم تكن قد شاهدت الفيديو على مؤشرات قد ترغب في القيام بذلك أولا.
بسبب هذا الفيديو هو آخر طريقة العمل مع المؤشرات.
>> حتى انها بصدد الحديث حول بعض المفاهيم
أن نغطي في مؤشرات الفيديو، ونحن
الذهاب إلى يتستر عليها الآن، على افتراض انهم بالفعل
نوع من فهمها.
لذلك هذا مجرد تحذير عادل بك أنه إذا كنت تشاهد هذا الفيديو
وكنت لم أر ل مؤشرات الفيديو، وربما نوع من
تحلق فوق رأسك قليلا.
ولذا فإنه قد يكون من الأفضل لمشاهدته في هذا النظام.
>> لذلك رأينا بالفعل واحدة الطريق الى العمل مع المؤشرات،
وهو نعلن المتغير، ومن ثم نحن
تعريف متغير آخر، وهو مؤشر متغير، التي يشير إليها.
لذلك قمنا بإنشاء متغير مع اسم، لدينا
إنشاء المتغير الثاني مع اسم، ونشير أن المتغير الثاني
في ذلك أولا.
وهذا له نوع من المشكلة رغم ذلك، لأنه
يتطلب منا أن نعرف بالضبط مقدار الذاكرة نحن
سنحتاج الى لحظة يتم تصنيف برنامجنا.
>> لماذا هذا؟
لأننا بحاجة إلى أن نكون قادرين على تسمية أو تحديد جميع المتغيرات المحتملة
نحن قد تواجهها.
قد يكون لدينا مجموعة التي قد تكون قادرة على الاستمرار على الكثير من المعلومات،
لكنه ما زال لا دقيقة بالضبط بما فيه الكفاية.
ماذا لو أننا لا نعرف، ما إذا كان لدينا أي فكرة
كم نحن بحاجة في وقت الترجمة؟
أو ما إذا سيكون برنامجنا تشغيل لفترة طويلة حقا،
قبول المستعمل مختلف البيانات، ونحن لا يمكن حقا
تقدير ما إذا نحن سنحتاج الى 1000 وحدة؟
>> انها ليست مثل ما في وسعنا يقول في سطر الأوامر
أدخل كيفية العديد من العناصر كنت تعتقد أنك سوف تحتاج إليها.
حسنا ماذا لو أن تخمين خاطئ؟
تخصيص الذاكرة الديناميكية نوع من يسمح لنا الطريق
للالتفاف على هذه المشكلة بالذات.
والطريقة التي يفعل ذلك عن طريق استخدام المؤشرات.
>> يمكننا استخدام المؤشرات ل الحصول على حيوي
الذاكرة المخصصة، والذاكرة التي هي موزعة على النحو البرنامج قيد التشغيل.
ليست تخصيصها في وقت الترجمة.
عند تخصيص حيوي ذاكرة أنها تأتي من بركة
من الذاكرة المعروفة باسم الكومة.
قبل كافة الذاكرة قمنا تم العمل مع في سياق
تم القادمة من بركة من الذاكرة المعروفة باسم المكدس.
وهناك طريقة جيدة للعموما نضع في حكم mind-- وهذا
لا يحمل دائما صحيحا، ولكن الى حد كبير تقريبا
يحمل دائما true-- هو أن أي الوقت كنت تعطي اسم المتغير هو
ربما يعيش على المكدس.
وأي وقت كنت لا إعطاء المتغير اسما،
الذي يمكنك القيام به مع ذاكرة ديناميكية تخصيص، فإنه يعيش على كومة.
>> الآن أنا نوع من تقديم هذا النحو إذا كان هناك هذه البرك اثنين من الذاكرة.
ولكن كنت قد رأيت هذا الرسم البياني، والذي هو عادة
تمثيل ل الذاكرة ما يبدو،
ونحن لن نهتم جميع الاشياء في أعلى وأسفل.
ما يهمنا هو هذا الجزء في وسط هنا، كومة كومة و.
وكما ترون من قبل أبحث في هذا الرسم البياني،
هذه هي في الواقع وليس اثنين حمامات منفصلة من الذاكرة.
انها تجمع واحد مشترك من الذاكرة حيث أن تبدأ، في هذا البصرية
عليك أن تبدأ في الجزء السفلي والبدء في ملء
من أسفل مع مكدس، ولك تبدأ من أعلى والبدء في ملء
من أعلى إلى أسفل مع الكومة.
لكنها في الحقيقة ل تجمع نفسه، انها مجرد
مواقع مختلفة، مواقع مختلفة في الذاكرة التي يتم تخصيصها.
ويمكن نفاد ذاكرة من قبل أي وجود
كومة يذهب كل في طريقه إلى أسفل، أو لديك
مكدس يذهب كل في طريقه إلى القمة، أو وجود كومة كومة و
يجتمع ضد بعضها البعض.
كل هذه يمكن أن تكون الشروط التي تسبب برنامجك
نفاد الذاكرة.
حتى أن تبقي في الاعتبار.
عندما نتحدث عن كومة كومة و
نحن نتحدث عن نفس قطعة العامة من الذاكرة، فقط
أجزاء مختلفة من تلك الذاكرة.
>> فكيف نحصل حيوي تخصيص الذاكرة في المقام الأول؟
كيف تحصل على برنامجنا الذاكرة كما انها تعمل؟
حسنا C توفر وظيفة تسمى malloc، مخصص الذاكرة التي
يمكنك إجراء مكالمة، والتي تمرر في كم عدد بايت من الذاكرة التي تريدها.
حتى إذا كان البرنامج قيد التشغيل وكنت ترغب في وقت صحيح،
قد مالوك أربعة بايت الذاكرة، malloc الأقواس الأربعة.
>> سوف تذهب من خلال مالوك يبحث من خلال كومة،
لأننا حيوي تخصيص الذاكرة،
وسيعود لك مؤشر إلى أن الذاكرة.
أنها لا تعطيك التي memory-- فإنه لا تعطيه اسما،
أنها تعطيك مؤشر إلى ذلك.
وولهذا السبب مرة أخرى قلت انه من المهم لربما
لقد شاهدت الفيديو مؤشرات قبل أن نصل بعيدا جدا في هذا.
حتى malloc يذهب ل تعطيك عودة مؤشر.
>> إذا مالوك لا يمكن أن يعطيك أي الذاكرة لأنك نفد،
سأعطيك العودة مؤشر فارغة.
هل تذكر ماذا يحدث إذا نحن محاولة dereference مؤشر باطل؟
نحن نعاني خطأ ثوانى، أليس كذلك؟
وهذا ربما لم يكن جيدا.
>> وذلك في كل مرة تقوم فيها بإجراء مكالمة لmalloc كنت دائما، ودائما
تحتاج إلى التحقق ما إذا كان أو لم يكن المؤشر أنه أعطاك هو العودة فارغة.
إذا كان كذلك، تحتاج إلى إنهاء البرنامج لأنه إذا حاولت وdereference
مؤشر باطل وأنت تسير تعاني تجزئة الخطأ
والبرنامج هو الذهاب إلى تعطل على أي حال.
كيف لنا إذن أن ثابت الحصول على عدد صحيح؟
>> الباحث س.
ربما فعلنا ذلك حفنة من الأوقات، أليس كذلك؟
وهذا يخلق متغير يسمى س الذي يعيش على المكدس.
كيف يمكننا حيوي الحصول على عدد صحيح؟
الباحث نجمة بكسل يساوي malloc 4.
>> أو أكثر بشكل مناسب نستطيع أن نقول نجمة كثافة بكسل
يساوي حجم malloc من الباحث، فقط لرمي بعض أقل
الأرقام السحرية حول برنامجنا.
هذا هو الذهاب الى الحصول بالنسبة لنا أربعة بايت من الذاكرة من كومة،
والمؤشر نحصل إلى ذلك يسمى بكسل.
وبعد ذلك فقط كما كنا فعلت سابقا نحن
يمكن dereference مقصف ل الوصول إلى تلك الذاكرة.
كيف نحصل على عدد صحيح من المستخدم؟
نستطيع أن نقول الباحث س يساوي الحصول على كثافة العمليات.
هذا واضحة جدا.
ماذا لو أردنا أن إنشاء صفيف العاشر من العوامات التي تعيش على المكدس؟
تطفو stack_array-- هذا الاسم لدينا array-- بين قوسين معقوفين السينية.
سوف تخلق لنا مجموعة العاشر من العوامات التي تعيش على المكدس.
نحن يمكن أن تخلق مجموعة من العوامات الذي يعيش على كومة، أيضا.
بناء الجملة قد تبدو ل قليلا أكثر تعقيدا،
ولكن يمكننا القول تعويم يساوي نجم heap_array
مرات malloc س حجم عائم.
أحتاج مساحة كافية لعقد س القيم النقطة العائمة.
لذلك أقول إنني بحاجة إلى 100 العوامات، يطفو أو 1000.
حتى في هذه الحالة سيكون من 400 بايت مقابل 100 العوامات،
أو 4000 بايت 1000 العوامات، لأن كل تعويم يستغرق
أربعة بايت من المساحة.
>> بعد القيام بذلك يمكنني استخدام مربع تركيب شريحة في heap_array.
كما أود أن على stack_array، I يمكن الوصول إلى عناصرها بشكل فردي
باستخدام heap_array صفر، واحد heap_array.
ولكن أذكر السبب في أننا يمكن أن نفعل ذلك لأن اسم صفيف في C
هو في الحقيقة مؤشر ل العنصر الذي المصفوفة الأولى.
وبالتالي فإن حقيقة أننا اعلان حالة مجموعة من العوامات على كومة هنا
هو في الواقع مضللة بعض الشيء.
نحن حقا في السطر الثاني من التعليمات البرمجية هناك
خلق أيضا مؤشر إلى قطعة من الذاكرة أننا ثم القيام ببعض الأعمال مع.
>> هنا تكمن المشكلة الكبرى مع المخصصة بشكل حيوي ذاكرة الرغم من ذلك،
وهذا هو السبب في انها حقا مهم لتطوير بعض العادات الجيدة
عندما كنت تعمل معها.
على عكس أعلن ثابت الذاكرة، الذاكرة الخاصة بك
لم يتم إرجاع تلقائيا إلى النظام عندما يتم الدالة.
حتى إذا كان لدينا الرئيسي، و الرئيسية يدعو وظيفة
و عندما و التشطيبات كل ما يفعل ويعود التحكم للبرنامج
العودة الى الرئيسية، كل من الذاكرة وبالنظر إلى أن و استخدامها مرة أخرى.
ويمكن استخدامه مرة أخرى عن طريق بعض البرامج الأخرى،
أو بعض الوظائف الأخرى التي يحصل دعا في وقت لاحق الرئيسي.
فإنه يمكن استخدام تلك الذاكرة نفسها من جديد.
>> إذا كنت حيوي تخصيص الذاكرة على الرغم من
عليك أن تخبر صراحة النظام الذي كنت فعلت معها.
انها سوف تعقد على ذلك بالنسبة لك، والتي يمكن يؤدي إلى مشكلة كنت ينفد
من الذاكرة.
في واقع الأمر نشير أحيانا إلى أن ذلك هو تسرب الذاكرة.
وأحيانا هذه التسريبات الذاكرة يمكن أن يكون في الواقع مدمرة حقا
للحصول على أداء النظام.
>> إذا كنت من مستخدمي الانترنت متكررة قد تستخدم متصفحات الويب معينة،
وأنا لن أذكر أسماء هنا، ولكن هناك بعض متصفحات الويب هناك
التي هي سيئة السمعة لأنها في الواقع تسرب الذاكرة التي لا تحصل ثابتة.
وإذا تركت المتصفح مفتوحا لفترة طويلة جدا من الزمن، أيام
وأيام، أو أسابيع، وكنت في بعض الأحيان قد تلاحظ أن النظام الخاص بك
هو يعمل حقا، حقا ببطء.
والسبب في ذلك هو أن خصصت متصفح الذاكرة،
ولكن بعد ذلك لم يخبر النظام أن يتم ذلك معها.
وبحيث يترك ذاكرة أقل متاحة لجميع البرامج الأخرى الخاصة بك
لديك للمشاركة، لأنك leaking-- أن متصفح الويب
البرنامج هو تسرب الذاكرة.
كيف نعطي الذاكرة إلى الوراء عندما ننتهي معها؟
حسنا لحسن الحظ انها طريقة سهلة جدا للقيام بذلك.
نحن فقط تحريرها.
هناك وظيفة تسمى مجانا، أنه يقبل مؤشر إلى الذاكرة،
ونحن على ما يرام.
>> لذلك دعونا نقول اننا في وسط برنامجنا،
نريد أن malloc 50 حرفا.
نريد أن malloc صفيف يمكن قادرة على اجراء 50 حرفا.
وعندما نحصل على مؤشر إلى أن اسم هذا المؤشر هو كلمة.
ونحن نفعل كل ما نحن تنوي القيام به مع كلمة،
وبعد ذلك عندما نحن به نحن فقط تحريرها.
والآن لدينا عاد هؤلاء 50 بايت من الذاكرة إلى النظام.
بعض من وظيفة أخرى يمكن استخدامها.
نحن لا داعي للقلق حول تعرضه ل تسرب الذاكرة لأننا سراح كلمة.
لقد أعطينا الذاكرة إلى الوراء، لذلك نحن الانتهاء من العمل معها.
لذلك هناك ثلاثة القواعد الذهبية التي ينبغي
أن يوضع في الاعتبار كلما كنت حيوي تخصيص الذاكرة
مع malloc.
كل كتلة من الذاكرة التي كنت malloc يجب أن يتحرر
قبل انتهاء البرنامج قيد التشغيل.
الآن مرة أخرى، في الأجهزة أو في IDE هذا النوع من يحدث لك على أي حال
عندما you-- هذا سيحدث على أي حال عند إنهاء البرنامج،
سيتم الافراج عن الذاكرة.
ولكن هذا الترميز جيد عموما الممارسة دائما، عند الانتهاء من ذلك،
تحرير ما كنت قد mallocd.
>> أن قال، الشيء الوحيد الذي كنت قد mallocd ينبغي أن يتحرر.
إذا قمت بتعريف ثابت ل صحيح، الباحث س منقوطة،
الذي يعيش على المكدس، كنت لا نريد بعد ذلك لتحرير السينية.
الأمور حتى الوحيدة التي قمت يجب إطلاق سراح mallocd.
>> وأخيرا، لا شيء مجانا مرتين.
يمكن أن تؤدي إلى حالة غريبة أخرى.
لذلك كل ما كنت قد mallocd أن يفرج عنه.
فقط الأشياء التي قمت يجب الافراج malloc.
و لا شيء مجانا مرتين.
>> لذلك دعونا نذهب من خلال مثال هنا ما بعض المخصصة بشكل حيوي
الذاكرة قد تبدو مختلطة في بعض ذاكرة ثابتة.
ما قد يحدث هنا؟
نرى ما اذا كان يمكنك متابعة جنبا إلى جنب وتخمين ما هو
سيحدث ونحن نمضي من خلال كل هذه الأسطر من التعليمات البرمجية.
>> لذلك نحن نقول الباحث م.
ماذا يجري هنا؟
حسنا هذا هو بسيط جدا.
I إنشاء متغير عدد صحيح ودعا م.
أنا لون أخضر ذلك، لأن هذا هو اللون
التي تستخدم عندما أتحدث حول المتغيرات عدد صحيح.
انها المربع.
انه دعا م، ويمكنك مخزن صحيحة داخل منه.
>> ماذا لو كنت ثم يقول الباحث نجمة ل؟
حسنا هذا مشابهة جدا.
أنا خلق صندوق يسمى.
انها قادرة على عقد الباحث النجوم، مؤشرات إلى أعداد صحيحة.
لذلك أنا تلوين أنها الأخضر العش كذلك.
>> وأنا أعلم أنه لديه شيء للقيام مع عدد صحيح،
ولكنها ليست في حد ذاتها صحيح.
لكنه الى حد كبير نفس الفكرة.
لقد خلق الجزاء.
كل من هذه الحق نعيش الآن في بنية تخزين العناصر.
لقد منحت لهم على حد سواء الأسماء.
>> نجمة الباحث ب يساوي حجم malloc من الباحث.
قد يكون هذا واحد صعبة قليلا.
تأخذ ثانية والتفكير في ما تتوقع أن يحدث في هذا المخطط.
نجمة الباحث ب يساوي حجم malloc من الباحث.
>> حسنا هذا لا مجرد إنشاء صندوق واحد.
هذا الواقع يخلق صندوقين.
ويربط، فإنه يضع أيضا نقطة في العلاقة.
لقد خصصت كتلة واحدة من الذاكرة على الكومة.
لاحظ أن المربع الأيمن العلوي هناك لا يكون له اسم.
>> نحن mallocd ذلك.
كان موجودا في الكومة.
ولكن ب له اسم.
انها متغير مؤشر يسمى ب.
الذي يعيش على المكدس.
>> حتى انها قطعة من الذاكرة الذي يشير إلى واحد آخر.
تحتوي ب عنوان من تلك الكتلة من الذاكرة.
فإنه لا يكون له اسم غير ذلك.
ولكنه يشير إلى ذلك.
لذلك عندما نقول نجمة الباحث ب يساوي حجم malloc من الباحث، أن هناك حق،
أن السهم التي برزت على الجانب الأيمن هناك، وهذا كل شيء،
سآخذ يبدو مرة أخرى، هو ما يحدث.
كل ذلك يحدث في أن سطر واحد من التعليمات البرمجية.
الآن سوف نحصل على أكثر قليلا مباشرة مرة أخرى.
ويساوي العطف م.
هل تتذكر ما يساوي العطف م هو؟
حسنا هذا هو يحصل على عنوان إمز.
أو وضع أكثر بيانيا، نقاط لم.
>> ويساوي ب.
OK حتى هنا واحد آخر.
A يساوي ب.
ماذا سيحدث إلى الرسم البياني هذا الوقت؟
>> كذلك التذكير بأن يعمل عامل التعيين
عن طريق تعيين القيمة على الحق في القيمة على اليسار.
وذلك بدلا من الإشارة إلى m، وهي الآن يشير إلى نفس المكان الذي النقاط (ب)
(أ) لا تشير إلى باء، وهو نقاط حيث B.
>> إذا كان مدببة إلى b التي من شأنها أن وقد كان يساوي العطف ب.
ولكن بدلا من ذلك يساوي ب فقط يعني أن وب الآن
لافتا إلى نفس العنوان، ل داخل ب هو مجرد عنوان.
والآن من داخل هو نفس العنوان.
م يساوي 10، وربما الشيء الأكثر وضوحا
فعلناه في قليلا.
وضع 10 في المربع.
نجمة ب يساوي متر زائد 2، أذكر من لدينا ما نجم مؤشرات الفيديو ب تعني.
ونحن في طريقنا إلى dereference ب ووضع بعض القيمة في ذلك الموقع الذاكرة.
في هذه الحالة 12.
>> حتى عندما كنا dereference نقطة أذكر نسافر فقط بانخفاض سهم.
أو بعبارة أخرى، نحن الذهاب إلى هذا العنوان الذاكرة
ونحن التلاعب به بطريقة أو بأخرى.
وضعنا بعض القيمة في هناك.
في هذه الحالة نجمة ب يساوي م بالإضافة إلى 2 ل
انتقل إلى المتغير المشار إليه بواسطة ب، انتقل إلى ذاكرة المشار إليه بواسطة ب،
ووضع م 2 بالإضافة إلى هناك، 12.
>> الآن أنا سراح ب.
ماذا يحدث عند تحرير ب؟
تذكر ما قلته الوسائل الحرة.
ما أقوله عندما سراح ب؟
>> انتهيت من العمل معه، أليس كذلك؟
أنا في الأساس التخلي عن الذاكرة.
I يعيدها إلى النظام.
أنا لست بحاجة إلى هذا بعد الآن ما أنا أقول لهم، OK؟
>> الآن إذا قلت نجوم يساوي 11 يمكنك على الأرجح
اقول بالفعل أن شيئا سيئا سيحدث هنا، أليس كذلك؟
والواقع إذا حاولت بأنني ربما ستعاني تجزئة الخطأ.
لأنه الآن، على الرغم من في وقت سابق ان جزءا من الذاكرة
وأنه لا بد لي الوصول إلى، في هذه المرحلة
الآن أنا الوصول إلى الذاكرة أن هذا غير قانوني بالنسبة لي للوصول.
>> وهذا ما سنقوم على الأرجح أذكر، عندما كنا الوصول الذاكرة
أننا ليس من المفترض أن تعمل باللمس، هذا هو السبب الأكثر شيوعا
لتجزئة خطأ. وهكذا برنامجي
سوف تعطل إذا حاولت القيام بذلك.
ذلك مرة أخرى انها فكرة جيدة للحصول على الخير الممارسة الجيدة والعادات الراسخة
عند العمل مع malloc وحرة، بحيث كنت لا تعاني تجزئة
أخطاء، والتي تستخدمها لديك المخصصة بشكل حيوي
الذاكرة بشكل مسؤول.
>> أنا دوغ ويد هذا هو CS50.