1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:01,395 [เล่นเพลง] 3 00:00:01,395 --> 00:00:05,590 4 00:00:05,590 --> 00:00:07,940 >> DOUG LLOYD: OK เพื่อให้ข้อเสนอแนะ ก่อนที่จะเริ่มที่นี่ 5 00:00:07,940 --> 00:00:11,660 หากคุณยังไม่ได้ดูวิดีโอบน คำแนะนำที่คุณอาจต้องการที่จะทำครั้งแรก 6 00:00:11,660 --> 00:00:15,860 เพราะวิดีโอนี้เป็นอีกหนึ่ง วิธีการทำงานกับคำแนะนำ 7 00:00:15,860 --> 00:00:17,574 >> ดังนั้นมันเป็นไปที่จะพูดคุย เกี่ยวกับแนวความคิดบางอย่าง 8 00:00:17,574 --> 00:00:19,490 ที่เราจะกล่าวถึงใน ตัวชี้วิดีโอและเรา 9 00:00:19,490 --> 00:00:21,948 จะปัดสวะพวกเขาตอนนี้ สมมติว่าพวกเขาอยู่แล้ว 10 00:00:21,948 --> 00:00:23,090 การเรียงลำดับของความเข้าใจ 11 00:00:23,090 --> 00:00:25,440 เพื่อให้เป็นเพียงแค่เตือนของคุณ ว่าถ้าคุณเห็นวิดีโอนี้ 12 00:00:25,440 --> 00:00:27,814 และคุณยังไม่เห็น วิดีโอชี้มันอาจเรียงลำดับของ 13 00:00:27,814 --> 00:00:29,610 บินอยู่เหนือหัวของคุณนิด ๆ หน่อย ๆ 14 00:00:29,610 --> 00:00:32,080 และดังนั้นจึงอาจจะดีกว่า ดูในลำดับที่ 15 00:00:32,080 --> 00:00:34,710 >> ดังนั้นเราจึงได้เห็นแล้วหนึ่ง วิธีการที่จะทำงานร่วมกับตัวชี้ 16 00:00:34,710 --> 00:00:37,810 ซึ่งเป็นที่เราประกาศ ตัวแปรและจากนั้นเรา 17 00:00:37,810 --> 00:00:42,160 ประกาศตัวแปรอีกตัวชี้ ตัวแปรที่ชี้ไป 18 00:00:42,160 --> 00:00:44,870 ดังนั้นเราจึงได้สร้าง ตัวแปรที่มีชื่อเราได้ 19 00:00:44,870 --> 00:00:48,480 สร้างตัวแปรที่สองที่มีชื่อ และเราชี้ว่าตัวแปรที่สอง 20 00:00:48,480 --> 00:00:50,220 ที่แรกที่ 21 00:00:50,220 --> 00:00:52,370 ซึ่งการจัดเรียงของมี ปัญหา แต่เพราะ 22 00:00:52,370 --> 00:00:54,650 เราต้องรู้ว่า หน่วยความจำเท่าใดเรา 23 00:00:54,650 --> 00:00:57,600 จะต้องขณะนี้ โปรแกรมของเราจะรวบรวม 24 00:00:57,600 --> 00:00:58,220 >> ว่าเป็นเพราะเหตุใด 25 00:00:58,220 --> 00:01:03,338 เพราะเราจะต้องสามารถที่จะตั้งชื่อหรือ ระบุทั้งหมดของตัวแปรที่เป็นไปได้ 26 00:01:03,338 --> 00:01:04,129 เราอาจพบ 27 00:01:04,129 --> 00:01:07,910 เราอาจจะมีอาร์เรย์ที่อาจจะเป็น สามารถที่จะถือจำนวนมากของข้อมูล 28 00:01:07,910 --> 00:01:10,110 แต่ก็ยังคงไม่ได้ ว่ามีความแม่นยำพอ 29 00:01:10,110 --> 00:01:12,640 ถ้าเราไม่ทราบว่า สิ่งที่ถ้าเราไม่มีความคิด 30 00:01:12,640 --> 00:01:14,370 ว่าเราจะต้องรวบรวมเวลา? 31 00:01:14,370 --> 00:01:17,020 หรือสิ่งที่ถ้าโปรแกรมของเราจะ ทำงานเป็นเวลานานจริงๆ 32 00:01:17,020 --> 00:01:19,810 การยอมรับการใช้งานต่างๆ ข้อมูลและเราไม่สามารถจริงๆ 33 00:01:19,810 --> 00:01:23,170 ประมาณว่าเรากำลัง จะต้อง 1,000 หน่วย? 34 00:01:23,170 --> 00:01:26,060 >> มันไม่เหมือนที่เราสามารถทำได้ บอกว่าที่บรรทัดคำสั่ง 35 00:01:26,060 --> 00:01:28,040 ใส่จำนวนรายการ คุณคิดว่าคุณจะต้อง 36 00:01:28,040 --> 00:01:31,100 ดีสิ่งที่คาดเดาว่าเป็นสิ่งที่ผิด? 37 00:01:31,100 --> 00:01:34,300 แบบไดนามิกจัดสรรหน่วยความจำ การเรียงลำดับของช่วยให้เราทาง 38 00:01:34,300 --> 00:01:36,867 จะได้รับการแก้ไขปัญหานี้โดยเฉพาะอย่างยิ่ง 39 00:01:36,867 --> 00:01:38,700 และวิธีที่มันไม่ได้ โดยใช้ตัวชี้ 40 00:01:38,700 --> 00:01:42,140 >> เราสามารถใช้ตัวชี้ไปยัง ได้รับการเข้าถึงแบบไดนามิก 41 00:01:42,140 --> 00:01:45,710 จัดสรรหน่วยความจำหน่วยความจำที่มีอยู่ จัดสรรเป็นโปรแกรมของคุณทำงาน 42 00:01:45,710 --> 00:01:48,290 มันไม่ได้รับการจัดสรรที่รวบรวมเวลา 43 00:01:48,290 --> 00:01:51,570 เมื่อคุณแบบไดนามิกจัดสรร หน่วยความจำมาจากสระว่ายน้ำ 44 00:01:51,570 --> 00:01:53,795 ของหน่วยความจำที่รู้จักกันเป็นกอง 45 00:01:53,795 --> 00:01:56,420 ก่อนหน้านี้หน่วยความจำทั้งหมดที่เราได้ ได้ทำงานร่วมกับในหลักสูตร 46 00:01:56,420 --> 00:01:59,920 ได้รับมาจากสระว่ายน้ำ ของหน่วยความจำที่รู้จักกันเป็นกอง 47 00:01:59,920 --> 00:02:02,470 วิธีที่ดีในทั่วไป เก็บไว้ใน mind-- และกฎนี้ 48 00:02:02,470 --> 00:02:04,720 ไม่เคยถือจริง แต่เกือบจะสวยมาก 49 00:02:04,720 --> 00:02:09,940 มักจะถือ true-- เป็นที่ใด เวลาที่คุณให้ชื่อตัวแปรมัน 50 00:02:09,940 --> 00:02:12,090 อาจจะมีชีวิตอยู่ในกอง 51 00:02:12,090 --> 00:02:14,650 และทุกครั้งที่คุณทำไม่ได้ ให้ตัวแปรชื่อ 52 00:02:14,650 --> 00:02:19,160 ซึ่งคุณสามารถทำกับหน่วยความจำแบบไดนามิก การจัดสรรก็อาศัยอยู่ในกอง 53 00:02:19,160 --> 00:02:22,190 >> ตอนนี้ฉันชนิดของที่นำเสนอนี้เป็น ถ้ามีทั้งสองสระว่ายน้ำของหน่วยความจำ 54 00:02:22,190 --> 00:02:24,740 แต่คุณอาจจะได้เห็นนี้ แผนภาพซึ่งโดยทั่วไป 55 00:02:24,740 --> 00:02:27,290 ตัวแทนของ สิ่งที่หน่วยความจำที่มีลักษณะเหมือน 56 00:02:27,290 --> 00:02:30,373 และเราจะไม่เกี่ยวกับการดูแลทั้งหมด สิ่งที่ด้านบนและด้านล่าง 57 00:02:30,373 --> 00:02:33,580 สิ่งที่เราดูแลเกี่ยวกับการเป็นส่วนหนึ่งในเรื่องนี้ กลางที่นี่กองและสแต็ค 58 00:02:33,580 --> 00:02:35,570 ที่คุณสามารถดูโดย กำลังมองหาที่แผนภาพนี้ 59 00:02:35,570 --> 00:02:38,390 เหล่านี้จริงไม่ได้สอง สระว่ายน้ำที่แยกต่างหากจากหน่วยความจำ 60 00:02:38,390 --> 00:02:42,757 มันเป็นหนึ่งในสระว่ายน้ำที่ใช้ร่วมกันของหน่วยความจำ ที่คุณเริ่มในภาพนี้ 61 00:02:42,757 --> 00:02:44,590 คุณเริ่มต้นที่ด้านล่าง และเริ่มเติมขึ้น 62 00:02:44,590 --> 00:02:48,040 จากด้านล่างกับสแต็คและคุณ เริ่มต้นที่ด้านบนและเริ่มต้นการเติมขึ้น 63 00:02:48,040 --> 00:02:50,072 จากด้านบนลงกับกอง 64 00:02:50,072 --> 00:02:51,780 แต่จริงๆมันเป็น สระว่ายน้ำเหมือนกันก็เพียง 65 00:02:51,780 --> 00:02:56,050 จุดที่แตกต่างกันสถานที่ต่างกัน ในความทรงจำที่มีการจัดสรร 66 00:02:56,050 --> 00:02:59,060 และคุณสามารถวิ่งออกมาจาก หน่วยความจำโดยมี 67 00:02:59,060 --> 00:03:01,240 กองไปตลอดทาง ไปที่ด้านล่างหรือมี 68 00:03:01,240 --> 00:03:05,440 สแต็คไปตลอดทางไปด้านบน หรือมีกองและสแต็ค 69 00:03:05,440 --> 00:03:06,740 พบกับแต่ละอื่น ๆ 70 00:03:06,740 --> 00:03:09,500 ทุกคนสามารถเป็นเงื่อนไข ที่ก่อให้เกิดโปรแกรมของคุณ 71 00:03:09,500 --> 00:03:11,030 ที่จะวิ่งออกจากหน่วยความจำ 72 00:03:11,030 --> 00:03:11,952 ดังนั้นเก็บที่ในใจ 73 00:03:11,952 --> 00:03:13,660 เมื่อเราพูดถึง กองและกอง 74 00:03:13,660 --> 00:03:17,880 เราเป็นจริงๆพูดคุยเกี่ยวกับ ก้อนเดียวกันทั่วไปของหน่วยความจำเพียง 75 00:03:17,880 --> 00:03:21,930 ส่วนที่แตกต่างกันของหน่วยความจำที่ 76 00:03:21,930 --> 00:03:24,910 >> ดังนั้นวิธีการที่เราจะได้รับแบบไดนามิก จัดสรรหน่วยความจำในสถานที่แรก? 77 00:03:24,910 --> 00:03:27,740 วิธีการที่ไม่ได้รับโปรแกรมของเรา หน่วยความจำที่มันทำงานอยู่หรือไม่ 78 00:03:27,740 --> 00:03:32,660 ดีซีมีฟังก์ชั่นที่เรียกว่า malloc, จัดสรรหน่วยความจำซึ่ง 79 00:03:32,660 --> 00:03:36,810 คุณโทรไปและคุณผ่านใน จำนวนไบต์หน่วยความจำที่คุณต้องการ 80 00:03:36,810 --> 00:03:39,940 ดังนั้นถ้าโปรแกรมของคุณทำงาน และคุณต้องการรันไทม์จำนวนเต็ม 81 00:03:39,940 --> 00:03:46,040 คุณอาจ Mallock สี่ไบต์ หน่วยความจำ malloc วงเล็บสี่ 82 00:03:46,040 --> 00:03:48,540 >> Mallock จะผ่านไป มองผ่านกอง 83 00:03:48,540 --> 00:03:50,750 เพราะเราแบบไดนามิก การจัดสรรหน่วยความจำ 84 00:03:50,750 --> 00:03:53,500 และจะกลับมาที่คุณ ตัวชี้ไปยังหน่วยความจำที่ 85 00:03:53,500 --> 00:03:56,180 มันไม่ได้ทำให้คุณ memory-- ว่า ก็ไม่ได้ให้ชื่อ 86 00:03:56,180 --> 00:03:57,950 จะช่วยให้คุณเป็นตัวชี้ไป 87 00:03:57,950 --> 00:04:00,780 และนั่นเป็นเหตุผลที่ผมกล่าวอีกครั้ง ว่ามันเป็นสิ่งสำคัญที่จะอาจจะ 88 00:04:00,780 --> 00:04:03,770 ได้ดูตัวชี้วิดีโอ ก่อนที่เราจะได้รับมากเกินไปที่จะเป็นแบบนี้ 89 00:04:03,770 --> 00:04:05,940 ดังนั้น malloc จะ ให้คุณกลับตัวชี้ 90 00:04:05,940 --> 00:04:08,950 >> หาก Mallock ไม่สามารถให้การใด ๆ หน่วยความจำเพราะคุณได้หมด 91 00:04:08,950 --> 00:04:10,645 มันจะทำให้คุณกลับชี้โมฆะ 92 00:04:10,645 --> 00:04:15,282 คุณจำสิ่งที่เกิดขึ้นถ้าเรา และพยายาม dereference ตัวชี้โมฆะ? 93 00:04:15,282 --> 00:04:17,019 เราประสบความผิด seg ใช่มั้ย? 94 00:04:17,019 --> 00:04:18,060 ที่อาจไม่ดี 95 00:04:18,060 --> 00:04:21,579 >> ดังนั้นเวลาที่คุณโทรออกทุก เพื่อ malloc คุณเสมอเสมอ 96 00:04:21,579 --> 00:04:25,270 ต้องตรวจสอบหรือไม่ ตัวชี้มันทำให้คุณกลับมาเป็นโมฆะ 97 00:04:25,270 --> 00:04:28,800 ถ้าเป็นคุณจะต้องจบโปรแกรมของคุณ เพราะถ้าคุณพยายาม dereference 98 00:04:28,800 --> 00:04:31,360 ตัวชี้ null ที่คุณกำลังจะ ที่จะประสบความผิดของการแบ่งส่วน 99 00:04:31,360 --> 00:04:34,380 และโปรแกรมของคุณ จะผิดพลาดอยู่แล้ว 100 00:04:34,380 --> 00:04:37,190 ดังนั้นวิธีการที่เราทำแบบคงที่ ได้รับจำนวนเต็ม? 101 00:04:37,190 --> 00:04:37,730 >> int x 102 00:04:37,730 --> 00:04:40,010 เราได้ทำอาจจะเป็นที่ พวงครั้งใช่มั้ย? 103 00:04:40,010 --> 00:04:43,480 นี้จะสร้างตัวแปรที่เรียกว่า x ที่อาศัยอยู่ในกอง 104 00:04:43,480 --> 00:04:46,190 เราทำแบบไดนามิกได้รับจำนวนเต็มอย่างไร 105 00:04:46,190 --> 00:04:50,010 px ดาว Int เท่ากับ malloc 4 106 00:04:50,010 --> 00:04:53,050 >> หรือมากกว่าอย่างเหมาะสม เราจะบอกว่า int ดาว px 107 00:04:53,050 --> 00:04:57,680 เท่ากับขนาดของ malloc int, เพียงเพื่อโยนบางน้อย 108 00:04:57,680 --> 00:04:59,740 หมายเลขมายากลรอบโปรแกรมของเรา 109 00:04:59,740 --> 00:05:04,140 นี้เป็นไปเพื่อให้ได้สำหรับเรา สี่ไบต์ของหน่วยความจำจากกอง 110 00:05:04,140 --> 00:05:06,720 และตัวชี้ที่เราได้รับ กลับไปจะเรียกว่าพิกเซล 111 00:05:06,720 --> 00:05:08,430 และจากนั้นก็เช่นเดียวกับเราได้ เราทำก่อนหน้านี้ 112 00:05:08,430 --> 00:05:13,966 สามารถ dereference px ไป เข้าถึงหน่วยความจำที่ 113 00:05:13,966 --> 00:05:15,590 เราจะได้รับจำนวนเต็มจากผู้ใช้อย่างไร 114 00:05:15,590 --> 00:05:17,970 เราสามารถพูดได้ int x เท่ากับได้รับ int 115 00:05:17,970 --> 00:05:19,930 นั่นคือตรงไปตรงสวย 116 00:05:19,930 --> 00:05:24,030 ถ้าเราต้องการที่จะสร้างอาร์เรย์ ของ x ลอยที่อาศัยอยู่ในกอง? 117 00:05:24,030 --> 00:05:28,210 ลอย stack_array-- ที่ชื่อ ของวงเล็บของเรา array-- x 118 00:05:28,210 --> 00:05:32,419 ที่จะสร้างให้เราอาร์เรย์ ของ x ลอยที่อาศัยอยู่ในกอง 119 00:05:32,419 --> 00:05:34,960 เราสามารถสร้างอาร์เรย์ของลอย ที่อาศัยอยู่ในกองด้วย 120 00:05:34,960 --> 00:05:37,330 ไวยากรณ์อาจดู เล็ก ๆ น้อย ๆ ที่ยุ่งยากมากขึ้น 121 00:05:37,330 --> 00:05:41,740 แต่เราสามารถพูดลอย heap_array ดาวเท่ากับ 122 00:05:41,740 --> 00:05:44,360 malloc ครั้ง x ขนาดของลอย 123 00:05:44,360 --> 00:05:48,160 ฉันต้องมีห้องพอที่จะถือ x ลอยค่าจุด 124 00:05:48,160 --> 00:05:51,560 เพื่อบอกว่าฉันต้อง 100 ลอยลอยหรือ 1000 125 00:05:51,560 --> 00:05:54,810 ดังนั้นในกรณีที่ว่ามันจะเป็น 400 ไบต์ 100 ลอย 126 00:05:54,810 --> 00:05:59,080 หรือ 4,000 ไบต์ 1,000 ลอย เพราะแต่ละคนจะขึ้นลอย 127 00:05:59,080 --> 00:06:01,230 สี่ไบต์ของพื้นที่ 128 00:06:01,230 --> 00:06:05,110 >> หลังจากทำเช่นนี้ฉันสามารถใช้ ไวยากรณ์วงเล็บเหลี่ยมบน heap_array 129 00:06:05,110 --> 00:06:08,970 ขณะที่ผมจะอยู่บน stack_array ผม สามารถเข้าถึงองค์ประกอบของรายบุคคล 130 00:06:08,970 --> 00:06:11,590 ใช้ heap_array ศูนย์ heap_array หนึ่ง 131 00:06:11,590 --> 00:06:15,800 แต่จำเหตุผลที่เราสามารถทำอย่างนั้น เป็นเพราะชื่อของอาร์เรย์ใน C ที่ 132 00:06:15,800 --> 00:06:19,990 เป็นจริงชี้ไปยัง องค์ประกอบแรกของอาร์เรย์ที่ 133 00:06:19,990 --> 00:06:23,480 ดังนั้นความจริงที่ว่าเรากำลังประกาศที่ อาร์เรย์ของลอยในกองที่นี่ 134 00:06:23,480 --> 00:06:24,810 เป็นจริงบิตทำให้เข้าใจผิด 135 00:06:24,810 --> 00:06:27,600 จริงๆเราอยู่ใน บรรทัดที่สองของรหัสมี 136 00:06:27,600 --> 00:06:32,360 ยังมีการสร้างตัวชี้ไปยังก้อนของ หน่วยความจำที่เราก็ทำผลงานบางคนที่มี 137 00:06:32,360 --> 00:06:35,620 >> นี่คือปัญหาใหญ่กับการเป็น หน่วยความจำจัดสรรแบบไดนามิกแม้ว่า 138 00:06:35,620 --> 00:06:38,360 และนี่คือเหตุผลที่มันเป็นจริงๆ สิ่งสำคัญที่จะพัฒนานิสัยที่ดีบางอย่าง 139 00:06:38,360 --> 00:06:39,800 เมื่อคุณกำลังทำงานกับมัน 140 00:06:39,800 --> 00:06:43,060 ซึ่งแตกต่างจากการประกาศแบบคงที่ หน่วยความจำหน่วยความจำของคุณ 141 00:06:43,060 --> 00:06:46,790 จะไม่ส่งคืนโดยอัตโนมัติไปยัง เมื่อระบบการทำงานของคุณจะทำ 142 00:06:46,790 --> 00:06:49,280 ดังนั้นหากเรามีหลักและ หลักเรียกฟังก์ชั่น 143 00:06:49,280 --> 00:06:53,860 ฉเมื่อเสร็จสิ้นฉสิ่งที่มันทำ และผลตอบแทนการควบคุมของโปรแกรม 144 00:06:53,860 --> 00:06:58,810 กลับไปที่หลักทั้งหมดของหน่วยความจำ ฉใช้ที่จะได้รับกลับมา 145 00:06:58,810 --> 00:07:01,250 มันสามารถนำมาใช้อีกครั้ง โดยบางส่วนโปรแกรมอื่น ๆ 146 00:07:01,250 --> 00:07:04,250 หรือฟังก์ชั่นอื่น ๆ ที่ ได้รับการเรียกในภายหลังในหลัก 147 00:07:04,250 --> 00:07:06,970 มันสามารถใช้หน่วยความจำเดียวกันกับที่อีกครั้ง 148 00:07:06,970 --> 00:07:09,620 >> หากคุณแบบไดนามิก แม้ว่าจัดสรรหน่วยความจำ 149 00:07:09,620 --> 00:07:14,380 คุณต้องบอกอย่างชัดเจน ระบบที่คุณกำลังทำกับมัน 150 00:07:14,380 --> 00:07:18,370 มันจะถือเข้ามันสำหรับคุณที่จะทำได้ นำไปสู่​​การแก้ไขปัญหาของคุณทำงานออก 151 00:07:18,370 --> 00:07:19,290 ของหน่วยความจำ 152 00:07:19,290 --> 00:07:22,179 และในความเป็นจริงบางครั้งเราดู ถึงนี้เป็นหน่วยความจำรั่ว 153 00:07:22,179 --> 00:07:24,970 และบางครั้งการรั่วไหลของหน่วยความจำเหล่านี้ จริงสามารถทำลายล้างจริงๆ 154 00:07:24,970 --> 00:07:27,020 สำหรับการทำงานของระบบ 155 00:07:27,020 --> 00:07:31,120 >> หากคุณเป็นผู้ใช้อินเทอร์เน็ตที่พบบ่อย คุณอาจใช้เว็บเบราเซอร์บางอย่าง 156 00:07:31,120 --> 00:07:35,630 และฉันจะไม่ได้ชื่อชื่อที่นี่ แต่ มีบางเว็บเบราเซอร์ออกมี 157 00:07:35,630 --> 00:07:39,150 ที่มีชื่อเสียงมีจริง การรั่วไหลของหน่วยความจำที่ไม่ได้รับการแก้ไข 158 00:07:39,150 --> 00:07:44,570 และถ้าคุณออกจากเบราว์เซอร์ของคุณเปิด เป็นระยะเวลานานมากเวลาวัน 159 00:07:44,570 --> 00:07:48,060 และวันหรือสัปดาห์ที่ผ่านมาบางครั้งคุณ อาจสังเกตเห็นว่าระบบของคุณ 160 00:07:48,060 --> 00:07:49,790 กำลังทำงานจริงๆช้า 161 00:07:49,790 --> 00:07:54,640 และเหตุผลที่ว่าก็คือ เบราว์เซอร์ได้จัดสรรหน่วยความจำ 162 00:07:54,640 --> 00:07:57,320 แต่แล้วก็ไม่ได้บอกระบบ ว่ามันทำกับมัน 163 00:07:57,320 --> 00:08:01,000 และเพื่อที่จะทิ้งหน่วยความจำน้อย ใช้ได้สำหรับทุกโปรแกรมอื่น ๆ ของคุณ 164 00:08:01,000 --> 00:08:04,480 ที่จะมีการร่วมกันเพราะคุณ leaking-- เว็บเบราเซอร์ที่ 165 00:08:04,480 --> 00:08:06,755 โปรแกรมมีการรั่วซึมของหน่วยความจำ 166 00:08:06,755 --> 00:08:08,880 เราจะทำอย่างไรให้หน่วยความจำกลับ เมื่อเรากำลังทำกับมันได้หรือไม่ 167 00:08:08,880 --> 00:08:10,838 โชคดีที่มันเป็น วิธีที่ง่ายมากที่จะทำมัน 168 00:08:10,838 --> 00:08:11,710 เราเพียงแค่มันฟรี 169 00:08:11,710 --> 00:08:15,020 มีฟังก์ชั่นที่เรียกว่าเป็นฟรี จะยอมรับตัวชี้ไปยังหน่วยความจำ 170 00:08:15,020 --> 00:08:16,010 และเราจะดีไป 171 00:08:16,010 --> 00:08:18,310 >> ดังนั้นขอบอกว่าเราอยู่ใน ตรงกลางของโปรแกรมของเรา 172 00:08:18,310 --> 00:08:21,970 เราต้องการที่จะ malloc 50 ตัวอักษร 173 00:08:21,970 --> 00:08:25,710 เราต้องการที่จะ malloc อาร์เรย์ที่สามารถ สามารถถือ 50 ตัวอักษร 174 00:08:25,710 --> 00:08:29,109 และเมื่อเราได้รับตัวชี้กลับไปที่ ที่ชื่อของตัวชี้ที่คำว่า 175 00:08:29,109 --> 00:08:30,900 เราทำสิ่งที่เรากำลัง จะทำอย่างไรกับคำ 176 00:08:30,900 --> 00:08:33,440 และจากนั้นเมื่อเราอยู่ ทำเราก็เป็นอิสระ 177 00:08:33,440 --> 00:08:37,460 และตอนนี้เราได้กลับมาเหล่านั้น 50 ไบต์หน่วยความจำกลับไปยังระบบ 178 00:08:37,460 --> 00:08:40,147 บางฟังก์ชั่นอื่น ๆ ที่สามารถใช้พวกเขา 179 00:08:40,147 --> 00:08:43,480 เราไม่ต้องกังวลเกี่ยวกับความทุกข์ หน่วยความจำรั่วเพราะเราได้ปลดปล่อยคำ 180 00:08:43,480 --> 00:08:46,639 เราได้หน่วยความจำกลับ ดังนั้นเราจึงเสร็จสิ้นการทำงานกับมัน 181 00:08:46,639 --> 00:08:48,430 ดังนั้นมีสาม กฎทองที่ควร 182 00:08:48,430 --> 00:08:51,700 เก็บไว้ในใจเมื่อใดก็ตามที่คุณ แบบไดนามิกจัดสรรหน่วยความจำ 183 00:08:51,700 --> 00:08:52,990 กับ malloc 184 00:08:52,990 --> 00:08:56,480 บล็อกของหน่วยความจำทุกที่ คุณ malloc ต้องได้รับการปลดปล่อย 185 00:08:56,480 --> 00:08:58,430 ก่อนที่โปรแกรมของคุณประสบความสำเร็จในการทำงาน 186 00:08:58,430 --> 00:09:02,029 ตอนนี้อีกครั้งในเครื่องหรือใน IDE นี้เรียงลำดับของการเกิดขึ้นสำหรับคุณอยู่แล้ว 187 00:09:02,029 --> 00:09:04,820 เมื่อ you-- นี้จะเกิดขึ้นต่อไป เมื่อโปรแกรมของคุณจะถูกยกเลิก 188 00:09:04,820 --> 00:09:06,880 หน่วยความจำทั้งหมดจะได้รับการปล่อยตัว 189 00:09:06,880 --> 00:09:10,750 แต่โดยทั่วไปการเขียนโปรแกรมที่ดี การปฏิบัติเสมอเมื่อคุณทำเสร็จแล้ว 190 00:09:10,750 --> 00:09:13,810 ฟรีสิ่งที่คุณได้ mallocd 191 00:09:13,810 --> 00:09:16,690 >> ที่กล่าวว่าสิ่งเดียวที่ คุณได้ mallocd ควรจะได้รับการปลดปล่อย 192 00:09:16,690 --> 00:09:19,880 หากคุณคงประกาศ จำนวนเต็ม int x กึ่งลำไส้ใหญ่ 193 00:09:19,880 --> 00:09:23,500 ที่อาศัยอยู่ในกองคุณ แล้วไม่ได้ต้องการที่จะเป็นอิสระ x 194 00:09:23,500 --> 00:09:25,970 สิ่งเดียวเพื่อให้คุณได้ mallocd ควรจะได้รับการปลดปล่อย 195 00:09:25,970 --> 00:09:28,960 >> และสุดท้ายจะทำสิ่งที่ไม่ฟรีครั้งที่สอง 196 00:09:28,960 --> 00:09:31,170 ที่สามารถนำไปสู่​​การ อีกสถานการณ์ที่แปลก 197 00:09:31,170 --> 00:09:33,530 ดังนั้นทุกอย่างที่คุณได้ mallocd จะต้องมีการปลดปล่อย 198 00:09:33,530 --> 00:09:36,000 สิ่งเดียวที่คุณได้ malloc ควรจะได้รับการปลดปล่อย 199 00:09:36,000 --> 00:09:38,730 และทำสิ่งที่ไม่ฟรีครั้งที่สอง 200 00:09:38,730 --> 00:09:43,660 >> ถ้าอย่างนั้นเราไปผ่านตัวอย่างที่นี่ ของสิ่งที่บางคนจัดสรรแบบไดนามิก 201 00:09:43,660 --> 00:09:46,122 หน่วยความจำอาจมีลักษณะผสม กับบางหน่วยความจำแบบคงที่ 202 00:09:46,122 --> 00:09:47,080 สิ่งที่อาจจะเกิดขึ้นที่นี่? 203 00:09:47,080 --> 00:09:48,913 ดูว่าคุณสามารถทำตาม พร้อมและคาดเดาสิ่งที่ 204 00:09:48,913 --> 00:09:51,720 ที่จะเกิดขึ้นในขณะที่เราไป ผ่านสายเหล่านี้ทั้งหมดของรหัส 205 00:09:51,720 --> 00:09:53,980 >> ดังนั้นเราจึงบอกว่า int เมตร 206 00:09:53,980 --> 00:09:54,840 เกิดขึ้นที่นี่คืออะไร? 207 00:09:54,840 --> 00:09:56,339 อย่างนี้ตรงไปตรงสวย 208 00:09:56,339 --> 00:09:59,650 ฉันสร้างตัวแปรจำนวนเต็มเรียกว่าม. 209 00:09:59,650 --> 00:10:01,400 ผมสีมันสีเขียว เนื่องจากว่าเป็นสี 210 00:10:01,400 --> 00:10:03,730 ที่ผมใช้เมื่อผมพูด เกี่ยวกับตัวแปรจำนวนเต็ม 211 00:10:03,730 --> 00:10:05,160 มันเป็นกล่อง 212 00:10:05,160 --> 00:10:08,400 มันเรียกว่าม. และคุณสามารถ ร้านจำนวนเต็มภายในของมัน 213 00:10:08,400 --> 00:10:12,400 >> เกิดอะไรขึ้นถ้าฉันแล้วพูดว่า int ดาว? 214 00:10:12,400 --> 00:10:13,530 ดีที่สวยเหมือนกัน 215 00:10:13,530 --> 00:10:15,780 ฉันสร้างกล่องที่เรียกว่า 216 00:10:15,780 --> 00:10:19,100 มันเป็นความสามารถในการถือครอง int ดาวตัวชี้ไปยังจำนวนเต็ม 217 00:10:19,100 --> 00:10:21,570 ดังนั้นฉันมันสีเขียว ish เช่นกัน 218 00:10:21,570 --> 00:10:24,140 >> ฉันรู้ว่ามันมีบางสิ่งบาง จะทำอย่างไรกับจำนวนเต็ม 219 00:10:24,140 --> 00:10:25,852 แต่ก็ไม่ได้ตัวเองจำนวนเต็ม 220 00:10:25,852 --> 00:10:27,310 แต่ก็สวยมากความคิดเดียวกัน 221 00:10:27,310 --> 00:10:28,101 เราได้สร้างกล่อง 222 00:10:28,101 --> 00:10:30,070 ทั้งสิทธิเหล่านี้ ตอนนี้อยู่ในกอง 223 00:10:30,070 --> 00:10:32,520 ฉันได้ให้แก่พวกเขาทั้งสองชื่อ 224 00:10:32,520 --> 00:10:36,750 >> int ดาวขเท่ากับขนาดของ malloc int 225 00:10:36,750 --> 00:10:38,560 หนึ่งในนี้อาจจะยุ่งยากเล็กน้อย 226 00:10:38,560 --> 00:10:44,110 สละเวลาให้คิดเกี่ยวกับสิ่งที่คุณ คาดว่าจะเกิดขึ้นในแผนภาพนี้ 227 00:10:44,110 --> 00:10:50,210 int ดาวขเท่ากับขนาดของ malloc int 228 00:10:50,210 --> 00:10:51,940 >> อย่างนี้ไม่ได้เพียงแค่สร้างกล่องหนึ่ง 229 00:10:51,940 --> 00:10:53,800 นี้จะสร้างสองกล่อง 230 00:10:53,800 --> 00:10:58,670 และความสัมพันธ์ก็ยังกำหนด จุดในความสัมพันธ์ 231 00:10:58,670 --> 00:11:02,240 เราได้จัดสรรหนึ่งช่วงตึก ของหน่วยความจำในกอง 232 00:11:02,240 --> 00:11:05,940 ขอให้สังเกตว่ากล่องด้านบนขวา มีไม่ได้มีชื่อ 233 00:11:05,940 --> 00:11:06,760 >> เรา mallocd มัน 234 00:11:06,760 --> 00:11:08,050 มันมีอยู่ในกอง 235 00:11:08,050 --> 00:11:10,090 แต่ขมีชื่อ 236 00:11:10,090 --> 00:11:11,950 มันเป็นตัวแปรตัวชี้ที่เรียกว่าข 237 00:11:11,950 --> 00:11:13,910 ที่อาศัยอยู่ในกอง 238 00:11:13,910 --> 00:11:18,250 >> ดังนั้นจึงเป็นชิ้นส่วนของหน่วยความจำ ที่ชี้ไปยังอีกคนหนึ่ง 239 00:11:18,250 --> 00:11:21,840 ขมีอยู่ ของบล็อกของหน่วยความจำที่ 240 00:11:21,840 --> 00:11:23,757 มันไม่ได้มีชื่อเป็นอย่างอื่น 241 00:11:23,757 --> 00:11:24,590 แต่มันชี้ไปที่มัน 242 00:11:24,590 --> 00:11:29,760 ดังนั้นเมื่อเราพูด int ดาวขเท่ากับ ขนาดของ malloc int ที่มีสิทธิ์ 243 00:11:29,760 --> 00:11:33,490 ลูกศรที่โผล่ขึ้นมาใน ด้านขวามีว่าสิ่งที่ทั้ง 244 00:11:33,490 --> 00:11:36,740 ฉันจะต้องปรากฏ อีกครั้งเป็นสิ่งที่เกิดขึ้น 245 00:11:36,740 --> 00:11:39,341 ทั้งหมดที่เกิดขึ้นใน ที่บรรทัดเดียวของรหัส 246 00:11:39,341 --> 00:11:41,340 ตอนนี้เราจะได้รับน้อยมาก ตรงไปตรงมาอีกครั้ง 247 00:11:41,340 --> 00:11:43,330 เท่ากับเครื่องหมายเมตร 248 00:11:43,330 --> 00:11:46,280 คุณจำสิ่งที่ เท่ากับม. เครื่องหมายคืออะไร? 249 00:11:46,280 --> 00:11:48,920 ดีที่ได้รับของที่อยู่ม. 250 00:11:48,920 --> 00:11:54,150 หรือใส่มากขึ้น diagrammatically, จุดที่จะม 251 00:11:54,150 --> 00:11:56,360 >> เท่ากับข 252 00:11:56,360 --> 00:11:57,560 ตกลงดังนั้นนี่คืออีกคนหนึ่ง 253 00:11:57,560 --> 00:11:59,230 เท่ากับข 254 00:11:59,230 --> 00:12:02,260 สิ่งที่จะเกิดขึ้น แผนภาพเวลานี้? 255 00:12:02,260 --> 00:12:04,330 >> ดีจำได้ว่า ผู้ประกอบการที่ได้รับมอบหมายงาน 256 00:12:04,330 --> 00:12:08,960 โดยการกำหนดค่าที่ สิทธิที่จะได้ค่าด้านซ้าย 257 00:12:08,960 --> 00:12:14,820 ดังนั้นแทนที่จะชี้เพื่อเมตรในขณะนี้ ชี้ไปที่สถานที่เดียวกันกับที่จุดข 258 00:12:14,820 --> 00:12:18,900 ไม่ได้ชี้ไปที่ b เป็น จุดที่จุดข 259 00:12:18,900 --> 00:12:25,280 >> ถ้าชี้ขที่จะ ได้รับเครื่องหมายเท่ากับข 260 00:12:25,280 --> 00:12:28,150 แต่แทนที่จะเท่ากับขเพียง หมายความว่าและ b เป็นตอนนี้ 261 00:12:28,150 --> 00:12:31,770 ชี้ไปยังที่อยู่เหมือนกันเพราะ ภายในของขเป็นเพียงที่อยู่ 262 00:12:31,770 --> 00:12:35,004 และตอนนี้ภายในเป็นที่อยู่เดียวกัน 263 00:12:35,004 --> 00:12:37,170 ม. เท่ากับ 10 น่าจะเป็น ส่วนใหญ่สิ่งที่ตรงไปตรงมา 264 00:12:37,170 --> 00:12:38,690 เราได้ทำในนิด ๆ หน่อย ๆ 265 00:12:38,690 --> 00:12:40,460 10 ใส่ในกล่อง 266 00:12:40,460 --> 00:12:45,640 ขดาวเท่ากับม. บวก 2 จำจาก ตัวชี้วิดีโอของเราสิ่งที่ดาวหมายถึงข 267 00:12:45,640 --> 00:12:50,230 เรากำลังจะไป dereference ขและใส่ ค่าบางอย่างในสถานที่ของหน่วยความจำที่ 268 00:12:50,230 --> 00:12:51,860 ในกรณีนี้ 12 269 00:12:51,860 --> 00:12:55,300 >> ดังนั้นเมื่อเรา dereference จุดของ จำได้เราก็เดินทางลงลูกศร 270 00:12:55,300 --> 00:12:58,205 หรือใส่อีกทางหนึ่งเรา ไปที่ที่อยู่หน่วยความจำที่ 271 00:12:58,205 --> 00:12:59,580 และเราจัดการกับมันในทางใดทางหนึ่ง 272 00:12:59,580 --> 00:13:00,830 เราใส่ค่าบางอย่างในการมี 273 00:13:00,830 --> 00:13:03,960 ดาวในกรณีนี้ข เท่ากับม. บวก 2 เป็นเพียง 274 00:13:03,960 --> 00:13:08,230 ไปที่ตัวแปรที่ชี้ไปตามข ไปที่หน่วยความจำที่ชี้ไปตามข 275 00:13:08,230 --> 00:13:11,750 และนำม. บวก 2 ในนั้น 12 276 00:13:11,750 --> 00:13:14,970 >> ตอนนี้ผมเป็นอิสระข 277 00:13:14,970 --> 00:13:16,490 จะเกิดอะไรขึ้นเมื่อฉันเป็นอิสระ B หรือไม่? 278 00:13:16,490 --> 00:13:18,800 โปรดจำไว้ว่าสิ่งที่ผมพูดหมายถึงฟรี 279 00:13:18,800 --> 00:13:21,920 สิ่งที่ฉันพูดเมื่อฉันเป็นอิสระ B หรือไม่? 280 00:13:21,920 --> 00:13:23,410 >> ฉันทำทำงานกับมันใช่มั้ย? 281 00:13:23,410 --> 00:13:25,702 ฉันเป็นหลักให้ขึ้นหน่วยความจำ 282 00:13:25,702 --> 00:13:26,910 ฉันจะให้มันกลับไปที่ระบบ 283 00:13:26,910 --> 00:13:33,010 ฉันไม่จำเป็นต้องนี้อีกต่อไปคือ สิ่งที่ฉันบอกพวกเขา, OK? 284 00:13:33,010 --> 00:13:37,390 >> ตอนนี้ถ้าผมบอกว่าดาว เท่ากับ 11 คุณอาจจะสามารถ 285 00:13:37,390 --> 00:13:40,460 แล้วบอกอะไรบางอย่างที่ไม่ดีที่ ที่จะเกิดขึ้นที่นี่ใช่มั้ย? 286 00:13:40,460 --> 00:13:44,160 และแน่นอนถ้าฉันพยายามที่ฉันอาจ จะประสบความผิดของการแบ่งส่วน 287 00:13:44,160 --> 00:13:47,140 เพราะตอนนี้แม้ว่า ก่อนหน้านี้ก้อนของหน่วยความจำที่ 288 00:13:47,140 --> 00:13:50,220 เป็นสิ่งที่ผมมี การเข้าถึงที่จุดนี้ 289 00:13:50,220 --> 00:13:54,590 ตอนนี้ฉันเข้าถึงหน่วยความจำที่ ไม่ได้ตามกฎหมายสำหรับผมที่จะเข้าถึง 290 00:13:54,590 --> 00:13:57,330 >> และในขณะที่เราอาจจะ จำได้เมื่อเราเข้าถึงหน่วยความจำ 291 00:13:57,330 --> 00:14:00,000 ที่เราไม่ควรที่จะสัมผัส นั่นเป็นสาเหตุที่พบบ่อยที่สุด 292 00:14:00,000 --> 00:14:01,860 ของการแบ่งส่วน ความผิด และเพื่อให้โปรแกรมของฉัน 293 00:14:01,860 --> 00:14:05,170 จะผิดพลาดถ้าผมพยายามที่จะทำเช่นนี้ 294 00:14:05,170 --> 00:14:09,910 ดังนั้นอีกครั้งมันเป็นความคิดที่ดีที่จะได้รับที่ดี การปฏิบัติและนิสัยที่ดีติดตัว 295 00:14:09,910 --> 00:14:12,920 เมื่อทำงานกับ malloc และฟรี เพื่อที่คุณจะไม่ประสบการแบ่งส่วน 296 00:14:12,920 --> 00:14:15,310 ความผิดพลาดและที่คุณใช้ คุณจัดสรรแบบไดนามิก 297 00:14:15,310 --> 00:14:17,370 หน่วยความจำที่มีความรับผิดชอบ 298 00:14:17,370 --> 00:14:20,300 >> ฉันลอยด์ดั๊กนี้ CS50 299 00:14:20,300 --> 00:14:21,947