คำถามติดแท็ก free

17
จะเกิดอะไรขึ้นเมื่อคุณไม่ว่างหลังจาก malloc?
นี่เป็นสิ่งที่รบกวนฉันมานานแล้ว เราทุกคนได้รับการสอนในโรงเรียน (อย่างน้อยฉันเป็น) ที่คุณต้องเป็นอิสระทุกตัวชี้ที่ได้รับการจัดสรร แต่ฉันก็อยากรู้อยากเห็นเกี่ยวกับต้นทุนที่แท้จริงของการไม่เพิ่มหน่วยความจำ ในบางกรณีที่เห็นได้ชัดเช่นเมื่อmallocมีการเรียกภายในลูปหรือส่วนหนึ่งของการประมวลผลเธรดเป็นสิ่งสำคัญมากที่จะต้องว่างดังนั้นจึงไม่มีหน่วยความจำรั่วไหล แต่ลองพิจารณาสองตัวอย่างต่อไปนี้: ก่อนอื่นถ้าฉันมีรหัสนั่นเป็นอย่างนี้: int main() { char *a = malloc(1024); /* Do some arbitrary stuff with 'a' (no alloc functions) */ return 0; } ผลลัพธ์ที่แท้จริงที่นี่คืออะไร ความคิดของฉันคือกระบวนการตายแล้วพื้นที่ฮีปก็หายไปดังนั้นจึงไม่มีอันตรายใด ๆ ในการที่จะพลาดการเรียกfree(แต่ฉันตระหนักถึงความสำคัญของการมีมันต่อไปสำหรับการปิดการบำรุงรักษาและการปฏิบัติที่ดี) ฉันคิดถูกไหม? ประการที่สองสมมติว่าฉันมีโปรแกรมที่ทำหน้าที่เหมือนเชลล์ ผู้ใช้สามารถประกาศตัวแปรเช่นaaa = 123นั้นและจะถูกเก็บไว้ในโครงสร้างข้อมูลแบบไดนามิกบางอย่างเพื่อใช้ในภายหลัง เห็นได้ชัดว่าดูเหมือนว่าคุณจะใช้วิธีแก้ปัญหาบางอย่างที่จะเรียกใช้ฟังก์ชันการจัดสรร * บางอย่าง (hashmap, รายการที่ลิงก์, สิ่งที่คล้ายกัน) สำหรับโปรแกรมประเภทนี้มันไม่สมเหตุสมผลเลยที่จะโทรฟรีmallocเพราะตัวแปรเหล่านี้จะต้องปรากฏตลอดเวลาในระหว่างการดำเนินการของโปรแกรมและไม่มีวิธีที่ดี (ที่ฉันเห็น) ในการดำเนินการนี้ด้วยการจัดสรรพื้นที่แบบคงที่ เป็นการออกแบบที่ไม่ดีที่จะมีหน่วยความจำจำนวนมากที่จัดสรรไว้ แต่ปล่อยให้เป็นอิสระซึ่งเป็นส่วนหนึ่งของกระบวนการที่สิ้นสุด ถ้าเป็นเช่นนั้นทางเลือกคืออะไร?
538 c  malloc  free 

11
ฟรีจะรู้ได้อย่างไรว่าฟรีมากแค่ไหน?
ในการเขียนโปรแกรม C คุณสามารถส่งตัวชี้ชนิดใดก็ได้ที่คุณชอบเป็นอาร์กิวเมนต์ให้เป็นอิสระมันจะทราบขนาดของหน่วยความจำที่จัดสรรให้ว่างได้อย่างไร เมื่อใดก็ตามที่ฉันส่งตัวชี้ไปยังฟังก์ชั่นบางอย่างฉันต้องผ่านขนาด (เช่นอาร์เรย์ขององค์ประกอบ 10 ต้องรับ 10 เป็นพารามิเตอร์เพื่อทราบขนาดของอาร์เรย์) แต่ฉันไม่ต้องส่งขนาดไปยัง ฟังก์ชั่นฟรี ทำไมไม่และฉันสามารถใช้เทคนิคเดียวกันนี้ในฟังก์ชั่นของฉันเองเพื่อช่วยให้ฉันไม่จำเป็นต้องซื้อรอบตัวแปรพิเศษของความยาวของอาร์เรย์?
384 c  size  pointers  free 

13
malloc () และ free () ทำงานอย่างไร
ฉันต้องการทราบวิธีการmallocและการfreeทำงาน int main() { unsigned char *p = (unsigned char*)malloc(4*sizeof(unsigned char)); memset(p,0,4); strcpy((char*)p,"abcdabcd"); // **deliberately storing 8bytes** cout << p; free(p); // Obvious Crash, but I need how it works and why crash. cout << p; return 0; } ฉันจะขอบคุณจริง ๆ ถ้าคำตอบอยู่ในระดับความลึกในระดับหน่วยความจำถ้าเป็นไปได้

23
การตั้งค่าตัวแปรเป็น NULL หลังจากว่าง
ใน บริษัท ของฉันมีกฎการเข้ารหัสที่บอกว่าหลังจากพ้นหน่วยความจำใด ๆ NULLตั้งค่าตัวแปร ตัวอย่างเช่น ... void some_func () { int *nPtr; nPtr = malloc (100); free (nPtr); nPtr = NULL; return; } ฉันรู้สึกว่าในกรณีเช่นรหัสที่แสดงด้านบนการตั้งค่าเป็นNULLไม่มีความหมายใด ๆ หรือว่าฉันขาดอะไรไป? หากไม่มีความหมายในกรณีเช่นนี้ฉันจะดำเนินการกับ "ทีมคุณภาพ" เพื่อลบกฎการเข้ารหัสนี้ โปรดให้คำแนะนำ.

10
ฟรี (ptr) ที่ ptr เป็นหน่วยความจำ NULL เสียหายหรือไม่
ในทางทฤษฎีฉันสามารถพูดได้ว่า free(ptr); free(ptr); เป็นความเสียหายของหน่วยความจำเนื่องจากเรากำลังปลดปล่อยหน่วยความจำที่ได้รับการปลดปล่อยไปแล้ว แต่ถ้า free(ptr); ptr=NULL; free(ptr); เนื่องจากระบบปฏิบัติการจะทำงานในลักษณะที่ไม่ได้กำหนดฉันจึงไม่สามารถรับการวิเคราะห์ทางทฤษฎีที่แท้จริงเกี่ยวกับสิ่งที่เกิดขึ้นได้ ไม่ว่าฉันกำลังทำอะไรอยู่นี้หน่วยความจำเสียหายหรือไม่? การพ้นตัวชี้ NULL ถูกต้องหรือไม่?

8
วิธีติดตามข้อผิดพลาด "ฟรีหรือเสียหายสองเท่า"
เมื่อฉันเรียกใช้โปรแกรม (C ++) ของฉันมันขัดข้องด้วยข้อผิดพลาดนี้ * ตรวจพบ glibc * ./load: ฟรีสองเท่าหรือเสียหาย (! prev): 0x0000000000c6ed50 *** ฉันจะติดตามข้อผิดพลาดได้อย่างไร ฉันลองใช้std::coutคำสั่งprint ( ) แต่ไม่ประสบความสำเร็จ สามารถgdbทำให้ง่ายขึ้น?
94 c++  c  debugging  free 

12
เหตุใด "อิสระ" ใน C จึงไม่ใช้จำนวนไบต์ที่จะทำให้เป็นอิสระ
เพื่อความชัดเจน: ฉันรู้mallocและfreeนำไปใช้ในไลบรารี C ซึ่งโดยปกติจะจัดสรรหน่วยความจำจากระบบปฏิบัติการและทำการจัดการของตัวเองเพื่อจัดเก็บหน่วยความจำจำนวนน้อยลงในแอปพลิเคชันและติดตามจำนวนไบต์ที่จัดสรร . คำถามนี้ไม่ได้เป็นวิธีการที่ไม่ฟรีรู้ว่าจะเป็นอิสระ แต่ฉันอยากรู้ว่าทำไมถึงfreeทำแบบนี้ตั้งแต่แรก ในฐานะที่เป็นภาษาระดับต่ำฉันคิดว่ามันเป็นเรื่องที่สมเหตุสมผลอย่างยิ่งที่จะขอให้โปรแกรมเมอร์ C ติดตามไม่เพียง แต่หน่วยความจำที่ได้รับการจัดสรร แต่เท่าไหร่ (อันที่จริงฉันมักจะพบว่าฉันติดตามจำนวนไบต์ malloced อยู่ดี) นอกจากนี้ยังเกิดขึ้นกับฉันที่การให้จำนวนไบต์อย่างชัดเจนfreeอาจอนุญาตให้มีการเพิ่มประสิทธิภาพประสิทธิภาพบางอย่างเช่นตัวจัดสรรที่มีพูลแยกต่างหากสำหรับขนาดการจัดสรรที่แตกต่างกันจะสามารถกำหนดพูลที่จะว่างเพียงแค่ดูที่อาร์กิวเมนต์อินพุตและ จะมีพื้นที่เหนือศีรษะโดยรวมน้อยลง ดังนั้นในระยะสั้นเหตุใดจึงถูกสร้างmallocและfreeสร้างขึ้นเช่นนี้จึงจำเป็นต้องติดตามจำนวนไบต์ที่จัดสรรไว้ภายใน เป็นเพียงอุบัติเหตุทางประวัติศาสตร์หรือไม่? การแก้ไขเล็กน้อย: มีคนไม่กี่คนที่ให้คะแนนเช่น "จะเกิดอะไรขึ้นถ้าคุณได้รับเงินจำนวนที่แตกต่างจากที่คุณจัดสรรให้" API ในจินตนาการของฉันอาจต้องการเพียงแค่หนึ่งเพื่อให้เป็นอิสระตามจำนวนไบต์ที่จัดสรร การปล่อยให้ว่างมากหรือน้อยอาจเป็นเพียง UB หรือการนำไปใช้ ฉันไม่ต้องการกีดกันการอภิปรายเกี่ยวกับความเป็นไปได้อื่น ๆ

3
ทำไมมูลค่าส่งคืนฟรีของนักแสดงจึงเป็นโมฆะ?
ฉันกำลังอ่านหนังสือ ( การเขียนโปรแกรมด้วย POSIX Threadsโดย Butenhof, 1997) ที่ใช้ C และฉันเจอบรรทัดต่อไปนี้: (void)free(data); นี่dataเป็นเพียงตัวชี้ไปยังโครงสร้างที่ปันส่วน data = malloc(sizeof(my_struct_t)); ทำไมเป็นผลมาจากfreeการถูกโยนไปvoid? จากความเข้าใจของฉันเกี่ยวกับ C สิ่งนี้ดูเหมือนจะไม่สมเหตุสมผลด้วยสองเหตุผล: ฟังก์ชันฟรีส่งคืนแล้ว void รหัสไม่ได้ใช้ค่าส่งคืน (มันไม่ได้ถูกกำหนดให้กับตัวแปร) หนังสือเล่มนี้เขียนขึ้นในปี 1997 นี่เป็นเรื่องของมรดกหรือเปล่า ผู้เขียนกล่าวว่าตัวอย่างทำงานบน Digital Unix 4.0d แต่ฉันก็ยังนึกภาพไม่ออกว่ามีเหตุผลอะไรที่จะส่งผลของฟังก์ชั่นหากคุณไม่ได้ใช้ผลลัพธ์นั้น
82 c  casting  free  void  legacy-code 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.