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

ฟังก์ชัน malloc ทำการจัดสรรหน่วยความจำแบบไดนามิกใน C และเป็นส่วนหนึ่งของไลบรารีมาตรฐาน ใช้แท็กนี้สำหรับคำถามเกี่ยวกับการใช้งานพฤติกรรมและการใช้งาน malloc

2
กำลังใช้ malloc สำหรับพฤติกรรมที่ไม่ได้กำหนดไว้จนถึง C ++ 20
ฉันได้รับแจ้งว่ารหัสต่อไปนี้มีพฤติกรรมที่ไม่ได้กำหนดไว้จนถึง C ++ 20: int *p = (int*)malloc(sizeof(int)); *p = 10; เป็นเช่นนั้นจริงหรือ? อาร์กิวเมนต์คืออายุการใช้งานของintอ็อบเจ็กต์ไม่ได้เริ่มต้นก่อนกำหนดค่าให้กับมัน ( P0593R6 ) ในการแก้ไขปัญหาnewควรใช้ตำแหน่ง: int *p = (int*)malloc(sizeof(int)); new (p) int; *p = 10; เราต้องเรียกตัวสร้างเริ่มต้นที่ไม่สำคัญเพื่อเริ่มอายุการใช้งานของวัตถุหรือไม่? ในเวลาเดียวกันรหัสไม่มีพฤติกรรมที่ไม่ได้กำหนดใน C บริสุทธิ์ แต่จะเป็นอย่างไรถ้าฉันจัดสรรintรหัสใน C และใช้ในรหัส C ++? // C source code: int *alloc_int(void) { int *p = (int*)malloc(sizeof(int)); *p = 10; …

8
เหตุใดฉันจึงได้รับความล้มเหลวในการยืนยัน C malloc
ฉันกำลังใช้การหารและพิชิตอัลกอริทึมพหุนามดังนั้นฉันจึงสามารถเปรียบเทียบกับการใช้งาน OpenCL ได้ แต่ฉันไม่สามารถmallocทำงานได้ เมื่อฉันเรียกใช้โปรแกรมมันจะจัดสรรสิ่งต่างๆมากมายตรวจสอบบางสิ่งจากนั้นส่งsize/2ไปยังอัลกอริทึม จากนั้นเมื่อฉันตีเส้นmallocอีกครั้งมันจะพ่นสิ่งนี้ออกมา: malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size …
86 c  gcc  malloc  assertion 

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