سؤال حول استخدام تطبيق إعادة التخصيص في كود C++

StackOverflow https://stackoverflow.com/questions/626123

  •  06-07-2019
  •  | 
  •  

سؤال

أصدقاء

في C++ الخاص بنا، أستخدم حاليًا طريقة realloc لتغيير حجم الذاكرة المخصصة بواسطة malloc.يتم استخدام realloc() على النحو التالي

my_Struct *strPtr =(my_struct*)malloc(sizeof(my_Struct));

/* an later */

strPtr = (my_struct*)realloc(strPtr,sizeof(my_Struct)*NBR);

الآن ويكيبيديا (_http://en.wikipedia.org/wiki/Malloc) تقول ذلك

إذا فعل ذلك بدلاً من ذلك

void *p = malloc(orig_size);

/* and later... */

p = realloc(p, big_size);

ثم في حالة عدم إمكانية الحصول على بايتات كبيرة الحجم من الذاكرة، ستكون p لها قيمة NULL ولن يكون لدينا مؤشر إلى الذاكرة المخصصة مسبقًا لـ p، مما يؤدي إلى حدوث تسرب للذاكرة

وتقول أيضًا أن الطريقة الصحيحة لتصحيح الخطأ أعلاه هي

void *p = malloc(orig_size);

/* and later... */

void *tmp = realloc(p, big_size); 

if (tmp != NULL)
 {

p = tmp; /* OK, assign new, larger storage to p */

} 

else 

{

/* handle the problem somehow */

}

هل يمكن أن تخبرني ما هي أفضل طريقة لاستخدام realloc()

أيضًا بمجرد أن يكون لدي مؤشر إلى بنية، ثم أثناء استخدام realloc لاحقًا، هل يمكنني استخدام المؤشر إلى الفراغ ؟؟؟

تشكرات

هل كانت مفيدة؟

المحلول

وبالطبع يجب أن تحمي ضد القضية التي realloc() عوائد NULL. وهو تخصيص الذاكرة، وفي C (حيث realloc()) يستخدم في الغالب، وأعتقد أن المبرمجين C ++ أعتقد أنه على مستوى منخفض قليلا / qaint لاستخدام المكالمات realloc() الخام، يمكن تخصيص الذاكرة تفشل دائما.

والكتابة فوق مباشرة المؤشر مع قيمة الإرجاع هو خطأ، لأن ذلك يسقط المؤشر الأصلي ويجعل تسرب الذاكرة في حالة فشل إعادة توزيع.

نصائح أخرى

Malloc() وrealloc() هما دالتان في لغة C.في الواقع، يقوم realloc() بتنفيذ malloc() وfree() اعتمادًا على الوسيطات التي تمررها:

  • إذا قمت بتمرير مؤشر فارغ، فإن realloc يفعل ما يفعله malloc.
  • إذا قمت بتمريرها بحجم صفر، فإن أداة إعادة التخصيص تقوم بما تفعله الخدمة المجانية.

نقلا عن هنا, ، حيث لديك شرح أعمق.

مكتبة C تجعل من المستحيل توسيع كتلة الذاكرة في مكانها، لذلك لا يدعمها C++ أيضًا.

إذا كنت تريد الاستمرار في وظائف C، فيجب عليك الضغط على المؤشر الخاص بتخصيص الذاكرة الأول عند استدعاء realloc().ثم تتحقق مما إذا كان NULL، وإلا فستقوم بتعيينه، تمامًا كما فعلت في الكود الأخير الخاص بك.

ولكن ربما يكون الحل الأفضل بالنسبة لـ C++ هو إنشاء أداة mallocator الخاصة بك، وهو الحل القياسي المبني على malloc() الخاص بـ C.يفحص هذا, ، أو هذا.

استخدم النهج المقترح - عقد المؤشر إلى المخزن المؤقت السابق حتى عاد realloc بنجاح. مرة واحدة realloc () إرجاع بنجاح كتلة السابق تم اطلاق سراح وأصبحت كل المؤشرات إلى ذلك التعلق - تعديلها

وrealloc وكذلك malloc لا يهمني ما هو نوع المؤشر - يمكنك استخدام باطل * وكذلك أي شيء *

وكما قال آخرون، ومجرد استخدام realloc بشكل صحيح كما هو مقترح.

ولكن "C ++ الطريق" للقيام بذلك هو في الحقيقة لاستخدام الأمراض المنقولة جنسيا :: ناقلات <> بدلا من الحفاظ على صفائف نفسك. بهذه الطريقة مكتبة C ++ القياسية سوف تأخذ الرعاية من التفاصيل ذات المستوى المنخفض من إعادة تخصيص (ويفترض باستخدام realloc ()).

وعندما تفشل realloc () وترجع خالي الذاكرة الأصلية يمسها.
لذلك يجب عليك استخدام مثل هذا:

my_Struct* strPtr =(my_struct*)malloc(sizeof(my_Struct));

/* an later */

my_Struct* tmp = (my_struct*)realloc(strPtr,sizeof(my_Struct)*NBR);
if (tmp != NULL)
{
    strPtr = tmp;
}
else
{
    /* realloc Failed. Need to do something */
}

لماذا أنت تستخدم malloc وrealloc؟ هناك دائما تقريبا بطريقة أفضل في C ++.

إذا كنت تستخدم لجعل صفائف متغيرة الطول، وكنت تقريبا أفضل حالا بالتأكيد مع الأمراض المنقولة جنسيا :: ناقلات <>، أو ربما يكون واحدا من القوالب حاوية أخرى.

إذا كنت تستخدم C بدلا من ذلك، ربما مع C ++ - مترجم قادر، ثم الطريقة الصحيحة هي الأسلوب الثاني، الذي لا يفقد كتلة ذاكرة بأكمله عندما يفشل في تخصيص

والجواب على سؤالك الثاني يعتمد أيضا على ما إذا كنت تستخدم C أو C ++. في C أو باطل * هو عام نوع مؤشر البيانات، وغير قابلة للتحويل بحرية. في C ++، الفراغ * يجب أن يتم تحويلها بشكل واضح. إذا كنت تكتب في الواقع C، تحتاج إلى استخدام malloc () والأصدقاء، والتي تعمل على الفراغ *. إذا كنت تكتب حقا C ++، تحتاج إلى الزهر، مما يجعله أكثر صعوبة. في كلتا الحالتين يفعل realloc () العمل على مؤشرات لبنية، ولكن بدلا مؤشرات إلى باطلا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top