.\" -*- coding: UTF-8 -*- '\" t .\" Copyright 1993, Thomas Koenig .\" Copyright 2007-2018, Michael Kerrisk .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\" FIXME . Review http://austingroupbugs.net/view.php?id=374 .\" to see what changes are required on this page. .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH malloc 3 "8 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم malloc, free, calloc, realloc, reallocarray \- تخصيص وتحرير الذاكرة الديناميكية .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#include \fP .P \fBvoid *malloc(size_t \fP\fIsize\fP\fB);\fP \fBvoid free(void *_Nullable \fP\fIp\fP\fB);\fP \fBvoid *calloc(size_t \fP\fIn\fP\fB, size_t \fP\fIsize\fP\fB);\fP \fBvoid *realloc(void *_Nullable \fP\fIp\fP\fB, size_t \fP\fIsize\fP\fB);\fP \fBvoid *reallocarray(void *_Nullable \fP\fIp\fP\fB, size_t \fP\fIn\fP\fB, size_t \fP\fIsize\fP\fB);\fP .fi .P .RS -4 متطلبات ماكروات اختبار الميزات لـ glibc (انظر \fBfeature_test_macros\fP(7)): .RE .P \fBreallocarray\fP(): .nf منذ glibc 2.29: _DEFAULT_SOURCE glibc 2.28 وما قبله: _GNU_SOURCE .fi .SH الوصف .SS malloc() تخصص الدالة \fBmalloc\fP() \fIsize\fP بايت وتُعيد مؤشرًا إلى الذاكرة المخصصة. \fIالذاكرة غير مهيأة\fP. إذا كان \fIsize\fP يساوي 0، تُعيد \fBmalloc\fP() قيمة مؤشر فريدة يمكن تمريرها لاحقًا بنجاح إلى \fBfree\fP(). (انظر "سلوك غير محمول" لمشكلات قابلية النقل.) .SS free() تحرر الدالة \fBfree\fP() مساحة الذاكرة المشار إليها بواسطة \fIp\fP، والتي يجب أن تكون قد أُعيدت باستدعاء سابق لـ \fBmalloc\fP() أو دوال ذات صلة. وإلا، أو إذا كان \fIp\fP قد حُرر بالفعل، يحدث سلوك غير محدد. إذا كان \fIp\fP هو NULL، لا تُجرى أي عملية. .SS calloc() تخصص الدالة \fBcalloc\fP() ذاكرة لمصفوفة من \fIn\fP عنصر، كل منها بحجم \fIsize\fP بايت، وتُعيد مؤشرًا إلى الذاكرة المخصصة. تُضبط الذاكرة على الصفر. إذا كان \fIn\fP أو \fIsize\fP يساوي 0، تُعيد \fBcalloc\fP() قيمة مؤشر فريدة يمكن تمريرها لاحقًا بنجاح إلى \fBfree\fP(). .P إذا أدى ضرب \fIn\fP و \fIsize\fP إلى تجاوز عدد صحيح، تُعيد \fBcalloc\fP() خطأ. على النقيض، لا يُكتشف تجاوز عدد صحيح في الاستدعاء التالي لـ \fBmalloc\fP()، مما يؤدي إلى تخصيص كتلة ذاكرة بحجم غير صحيح: .P .in +4n .EX malloc(n * size); .EE .in .SS realloc() تغير الدالة \fBrealloc\fP() حجم كتلة الذاكرة المشار إليها بواسطة \fIp\fP إلى \fIsize\fP بايت. تبقى محتويات الذاكرة دون تغيير في النطاق من بداية المنطقة حتى الحد الأدنى للحجمين القديم والجديد. إذا كان الحجم الجديد أكبر من الحجم القديم، فإن الذاكرة المضافة \fIلن\fP تُهيأ. .P إذا كان \fIp\fP هو NULL، فإن الاستدعاء يعادل \fImalloc(size)\fP، لجميع قيم \fIsize\fP. .P إذا كان \fIsize\fP يساوي صفرًا، و \fIp\fP ليس NULL، فإن الاستدعاء يعادل \fIfree(p)\fP (ولكن انظر "سلوك غير محمول" لمشكلات قابلية النقل). .P ما لم يكن \fIp\fP هو NULL، يجب أن يكون قد أُعيد باستدعاء سابق لـ \fBmalloc\fP أو دوال ذات صلة. إذا نُقلت المنطقة المشار إليها، تُجرى \fIfree(p)\fP. .SS reallocarray() تغير الدالة \fBreallocarray\fP() حجم (وربما تنقل) كتلة الذاكرة المشار إليها بواسطة \fIp\fP لتكون كبيرة بما يكفي لمصفوفة من \fIn\fP عنصر، كل منها بحجم \fIsize\fP بايت. وهي تعادل الاستدعاء .P .in +4n .EX realloc(p, n * size); .EE .in .P لكن، على عكس استدعاء \fBrealloc\fP() ذلك، تفشل \fBreallocarray\fP() بأمان في حالة حدوث فائض في الضرب. إذا حدث مثل هذا الفائض، تُرجع \fBreallocarray\fP() خطأ. .SH "قيمة الإرجاع" تُرجع دوال \fBmalloc\fP() و\fBcalloc\fP() و\fBrealloc\fP() و\fBreallocarray\fP() مؤشرًا إلى الذاكرة المُخصصة، وهي مُحاذاة بشكل مناسب لأي نوع يناسب الحجم المطلوب أو أقل. عند حدوث خطأ، تُرجع هذه الدوال NULL وتُعيِّن \fIerrno\fP. تُعد محاولة تخصيص أكثر من \fBPTRDIFF_MAX\fP بايت خطأ، لأن كائنًا بهذا الحجم قد يُسبب فائضًا في طرح المؤشرات لاحقًا. .P لا تُرجع دالة \fBfree\fP() أي قيمة، وتحافظ على \fIerrno\fP. .P تُرجع دالتا \fBrealloc\fP() و\fBreallocarray\fP() NULL إذا كان \fIp\fP ليس NULL وكان الحجم المطلوب صفرًا؛ لا يُعتبر هذا خطأ. (انظر "سلوك غير محمول" لمشكلات قابلية النقل.) خلاف ذلك، قد يكون المؤشر المُعاد هو نفسه \fIp\fP إذا لم يُنقل التخصيص (مثلًا، وُجدت مساحة لتوسيع التخصيص في مكانه)، أو مختلفًا عن \fIp\fP إذا نُقل التخصيص إلى عنوان جديد. إذا فشلت هاتان الدالتان، تُترك الكتلة الأصلية دون تغيير؛ لا تُحرر ولا تُنقل. .SH الأخطاء يمكن أن تفشل دوال \fBcalloc\fP() و\fBmalloc\fP() و\fBrealloc\fP() و\fBreallocarray\fP() مع الخطأ التالي: .TP \fBENOMEM\fP نفاد الذاكرة. ربما بلغ التطبيق حد \fBRLIMIT_AS\fP أو \fBRLIMIT_DATA\fP الموصوف في \fBgetrlimit\fP(2). قد يكون سبب آخر هو أن عدد التعيينات التي أنشأتها عملية المُستدعي تجاوز الحد المُحدد بواسطة \fI/proc/sys/vm/max_map_count\fP. .SH السمات للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. الواجهة السمة القيمة T{ .na .nh \fBmalloc\fP(), \fBfree\fP(), \fBcalloc\fP(), \fBrealloc\fP() T} سلامة الخيوط MT\-Safe .TE .SH المعايير .TP \fBmalloc\fP() .TQ \fBfree\fP() .TQ \fBcalloc\fP() .TQ \fBrealloc\fP() C23، ‏POSIX.1\-2024. .TP \fBreallocarray\fP() POSIX.1\-2024. .SS "realloc(p, 0)" لا يتوافق سلوك \fIrealloc(p,\0)\fP في glibc مع أي من C99 أو C11 أو POSIX.1\-2001 أو POSIX.1\-2004 أو POSIX.1\-2008 أو POSIX.1\-2013 أو POSIX.1\-2017 أو POSIX.1\-2024. غُيّرت مواصفات C17 لجعلها متوافقة، لكن تلك المواصفات جعلت من المستحيل كتابة كود يُحدد بشكل موثوق ما إذا كان المؤشر المُدخل قد حُرر بعد \fIrealloc(p,\ 0)\fP، وغيّرتها C23 مرة أخرى لجعل هذا سلوكًا غير مُحدد، معترفةً بأن مواصفات C17 كانت واسعة بما يكفي، بحيث لم يكن السلوك غير المُحدد أسوأ من ذلك. .P تعاني \fBreallocarray\fP() من نفس المشكلات في glibc. .P تتوافق musl libc و BSDs مع جميع إصدارات ISO C و POSIX.1. .P يوفر gnulib الوحدة \fIrealloc\-posix\fP، التي تُوفر غلافات \fBrealloc\fP() و\fBreallocarray\fP() تتوافق مع جميع إصدارات ISO C و POSIX.1. .P هناك اقتراح لتوحيد سلوك BSD: .UR https:\://www.open\-std.org/\:jtc1/\:sc22/\:wg14/\:www/\:docs/\:n3621.txt .UE . .SH التاريخ .TP \fBmalloc\fP() .TQ \fBfree\fP() .TQ \fBcalloc\fP() .TQ \fBrealloc\fP() POSIX.1\-2001، C89. .TP \fBreallocarray\fP() glibc 2.26. OpenBSD 5.6, FreeBSD 11.0. .P رفضت \fBmalloc\fP() والدوال ذات الصلة الأحجام الأكبر من \fBPTRDIFF_MAX\fP بدءًا من glibc 2.30. .P الدالة \fBfree\fP() تحافظ على \fIerrno\fP ابتداءً من glibc 2.33. .SS realloc(p,\ 0) كانت مواصفات C89 غامضة بخصوص \fIrealloc(p,\ 0)\fP. صحّح C99 هذا جزئيًا. .P كان التنفيذ الأصلي في glibc متوافقًا مع C99. لكن، ومن المفارقات، أن محاولة الامتثال لـ C99 قبل إصدار المعيار، غيّرت glibc سلوكها في glibc 2.1.1 إلى شيء لم ينتهِ به المطاف متوافقًا مع مواصفات C99 النهائية (لكن هذا محل جدل، إذ تبدو صياغة المعيار متناقضة مع ذاتها). .SH ملاحظات مبدئيًا، يتبع لينكس استراتيجية تفاؤلية لتخصيص الذاكرة. هذا يعني أنه عندما تُرجع \fBmalloc\fP() قيمة غير NULL، فلا يوجد ضمان بأن الذاكرة متاحة فعلًا. في حال اتضح أن النظام قد نفدت ذاكرته، فسيُقتل عملية أو أكثر بواسطة قاتل OOM. لمزيد من المعلومات، انظر وصف \fI/proc/sys/vm/overcommit_memory\fP و \fI/proc/sys/vm/oom_adj\fP في \fBproc\fP(5)، وملف مصدر نواة لينكس \fIDocumentation/vm/overcommit\-accounting.rst\fP. .P عادةً، تخصص \fBmalloc\fP() الذاكرة من الكومة، وتضبط حجم الكومة حسب الحاجة، باستخدام \fBsbrk\fP(2). عند تخصيص كتل ذاكرة أكبر من \fBMMAP_THRESHOLD\fP بايت، ينفذ تنفيذ glibc لـ \fBmalloc\fP() تخصيص الذاكرة كتعيين مجهول خاص باستخدام \fBmmap\fP(2). قيمة \fBMMAP_THRESHOLD\fP هي 128 كيلوبايت مبدئيًا، لكنها قابلة للضبط باستخدام \fBmallopt\fP(3). قبل لينكس 4.7، لم تتأثر التخصيصات المنفذة باستخدام \fBmmap\fP(2) بحد المورد \fBRLIMIT_DATA\fP؛ منذ لينكس 4.7، يُطبّق هذا الحد أيضًا على التخصيصات المنفذة باستخدام \fBmmap\fP(2). .P لتجنب الفساد في التطبيقات متعددة الخيوط، تُستخدم كائنات المزامنة (mutexes) داخليًا لحماية هياكل بيانات إدارة الذاكرة التي توظفها هذه الدوال. في تطبيق متعدد الخيوط حيث تخصص الخيوط الذاكرة وتحررها في وقت واحد، قد يحدث تنافس على كائنات المزامنة هذه. للتعامل مع تخصيص الذاكرة بشكل قابل للتوسع في التطبيقات متعددة الخيوط، تنشئ glibc \fIساحات تخصيص ذاكرة\fP إضافية إذا اكتُشف تنافس على كائن المزامنة. كل ساحة هي منطقة كبيرة من الذاكرة تخصصها النظام داخليًا (باستخدام \fBbrk\fP(2) أو \fBmmap\fP(2))، وتُدار بكائنات المزامنة الخاصة بها. .P إذا استخدم برنامجك مخصص ذاكرة خاصًا، فيجب أن يفعل ذلك عن طريق استبدال \fBmalloc\fP() و \fBfree\fP() و \fBcalloc\fP() و \fBrealloc\fP(). يجب أن تنفذ دوال الاستبدال السلوكيات الموثقة لـ glibc، بما في ذلك معالجة \fIerrno\fP، وتخصيصات الحجم صفر، والتحقق من الفائض؛ وإلا، فقد تتعطل أو تعمل بشكل غير صحيح روتينات مكتبة أخرى. على سبيل المثال، إذا لم تحافظ دالة \fIfree\fP() البديلة على \fIerrno\fP، فقد تفشل روتينات مكتبة تبدو غير ذات صلة دون سبب صحيح في \fIerrno\fP. قد تحتاج مخصصات الذاكرة الخاصة أيضًا إلى استبدال دوال glibc أخرى؛ انظر "Replacing malloc" في دليل glibc للتفاصيل. .P ترتبط الأعطال في مخصصات الذاكرة دائمًا تقريبًا بفساد الكومة، مثل تجاوز سعة قطعة مخصصة أو تحرير نفس المؤشر مرتين. .P تنفيذ \fBmalloc\fP() قابل للضبط عبر متغيرات البيئة؛ انظر \fBmallopt\fP(3) للتفاصيل. .SS "سلوك غير محمول" سلوك هذه الدوال عندما يكون الحجم المطلوب صفرًا خاص بـ glibc؛ قد تُرجع تطبيقات أخرى NULL دون تعيين \fIerrno\fP، ويجب على برامج POSIX المحمولة تحمل مثل هذا السلوك. انظر \fBrealloc\fP(3p). .P يتطلب POSIX من مخصصات الذاكرة تعيين \fIerrno\fP عند الفشل. لكن، لا يتطلب معيار C هذا، ولا ينبغي للتطبيقات المحمولة إلى منصات غير POSIX افتراض ذلك. .P لا ينبغي للبرامج المحمولة استخدام مخصصات ذاكرة خاصة، إذ لا يسمح POSIX ومعيار C باستبدال \fBmalloc\fP() و \fBfree\fP() و \fBcalloc\fP() و \fBrealloc\fP(). .SH العلل سيتوقع المبرمجون طبيعيًا بالاستقراء أن \fI\%realloc(p,\ size)\fP متسق مع \fIfree(p)\fP و \fImalloc(size)\fP، حيث أن هذا هو السلوك في الحالة العامة. هذا غير مطلوب صراحةً بواسطة POSIX.1\-2024 أو C11، لكن جميع التطبيقات المطابقة متسقة مع ذلك. .P تطبيق glibc للدالة \fBrealloc\fP() غير متسق مع ذلك، وكنتيجة لذلك، من الخطر استدعاء \fI\%realloc(p,\ 0)\fP في glibc. .P حل بديل تافه لـ glibc هو استدعاؤها كـ \fI\%realloc(p,\ size?size:1)\fP. .P الحل البديل للدالة \fBreallocarray\fP() في glibc \[em]التي تشارك نفس الخلل\[em] سيكون \fI\%reallocarray(p,\ n?n:1,\ size?size:1)\fP. .SH أمثلة .EX #include #include #include #include #include \& #define MALLOCARRAY(n, type) ((type *) my_mallocarray(n, sizeof(type))) #define MALLOC(type) MALLOCARRAY(1, type) \& static inline void *my_mallocarray(size_t n, size_t size); \& int main(void) { char *p; \& p = MALLOCARRAY(32, char); if (p == NULL) err(EXIT_FAILURE, "malloc"); \& strlcpy(p, "foo", 32); puts(p); } \& static inline void * my_mallocarray(size_t n, size_t size) { return reallocarray(NULL, n, size); } .EE .SH "انظر أيضًا" .\" http://g.oswego.edu/dl/html/malloc.html .\" A Memory Allocator - by Doug Lea .\" .\" http://www.bozemanpass.com/info/linux/malloc/Linux_Heap_Contention.html .\" Linux Heap, Contention in free() - David Boreham .\" .\" http://www.citi.umich.edu/projects/linux-scalability/reports/malloc.html .\" malloc() Performance in a Multithreaded Linux Environment - .\" Check Lever, David Boreham .\" .ad l .nh \fBvalgrind\fP(1), \fBbrk\fP(2), \fBmmap\fP(2), \fBalloca\fP(3), \fBmalloc_get_state\fP(3), \fBmalloc_info\fP(3), \fBmalloc_trim\fP(3), \fBmalloc_usable_size\fP(3), \fBmallopt\fP(3), \fBmcheck\fP(3), \fBmtrace\fP(3), \fBposix_memalign\fP(3) .P لتفاصيل تنفيذ مكتبة سي لجنو، انظر .UR https:\//sourceware.org/glibc/wiki/MallocInternals .UE . .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .