سؤال

كيف يمكنني realloc في C ++؟ يبدو أنه مفقود من اللغة - هناك new و delete لكن لا resize!

أحتاجه لأنه عندما يقرأ البرنامج المزيد من البيانات ، أحتاج إلى إعادة تخصيص المخزن المؤقت للاحتفاظ به. لا أعتقد deleteجي المؤشر القديم و newجي جديد ، أكبر ، هو الخيار الصحيح.

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

المحلول

استخدام :: std :: ناقلات!

Type* t = (Type*)malloc(sizeof(Type)*n) 
memset(t, 0, sizeof(Type)*m)

يصبح

::std::vector<Type> t(n, 0);

ثم

t = (Type*)realloc(t, sizeof(Type) * n2);

يصبح

t.resize(n2);

إذا كنت ترغب في نقل المؤشر إلى وظيفة ، بدلاً من

Foo(t)

استعمال

Foo(&t[0])

من الصحيح تمامًا رمز C ++ ، لأن المتجه عبارة عن مجموعة C ذكية.

نصائح أخرى

ربما يكون الخيار الصحيح هو استخدام حاوية تقوم بالعمل من أجلك ، مثل std::vector.

new و delete لا يمكن تغيير حجمها ، لأنها تخصص ذاكرة كافية للاحتفاظ بكائن من النوع المحدد. لن يتغير حجم نوع معين أبدًا. هناك new[] و delete[] ولكن بالكاد لا يوجد سبب لاستخدامها.

ماذا او ما realloc من المحتمل أن يكون في C مجرد أ malloc, memcpy و free, ، على أي حال ، على الرغم من أنه يُسمح لمديري الذاكرة بالقيام بشيء ذكي إذا كان هناك ما يكفي من الذاكرة المجاورة المجاورة المتاحة.

يعد تغيير حجمه في C ++ محرجًا بسبب الحاجة المحتملة إلى استدعاء المُنشئين والمدمرين.

لا أعتقد أن هناك سببًا أساسيًا لأنه في C ++ لا يمكنك الحصول على ملف resize[] المشغل للذهاب مع new[] و delete[], ، هذا فعل شيئًا مشابهًا لهذا:

newbuf = new Type[newsize];
std::copy_n(oldbuf, std::min(oldsize, newsize), newbuf);
delete[] oldbuf;
return newbuf;

بوضوح oldsize سيتم استرجاعها من موقع سري ، كما هو في delete[], ، و Type سيأتي من نوع المعامل. resize[] سوف يفشل عندما لا يكون النوع قابل للنسخ - وهو أمر صحيح ، حيث لا يمكن نقل هذه الكائنات ببساطة. أخيرًا ، يقوم الكود أعلاه بإعداد الكائنات قبل تعيينها ، والتي لا تريدها كسلوك فعلي.

هناك تحسين محتمل حيث newsize <= oldsize, ، لاستدعاء المدمرات للأشياء "الماضي" في النهاية "من الصفيف المنقذ حديثًا وعدم القيام بأي شيء آخر. يجب أن يحدد المعيار ما إذا كان هذا التحسين مطلوبًا (كما هو الحال عندك resize() ناقل) ، أو المسموح به ولكن غير محدد ، أو مسموح به ولكن يعتمد على التنفيذ ، أو ممنوع.

السؤال الذي يجب أن تسأله بعد ذلك هو ، "هل من المفيد بالفعل تقديم هذا ، بالنظر إلى ذلك vector كما يفعل ذلك ، ويتم تصميمه خصيصًا لتوفير حاوية قادرة على تغيير الحجم (من الذاكرة المتجاورة-أي متطلبات تم حذفها في C ++ 98 ولكن تم إصلاحها في C ++ 03) وهي مناسبة أفضل من المصفوفات مع طرق C ++ لعمل الأشياء ؟ "

أعتقد أن الجواب يعتقد على نطاق واسع أنه "لا". إذا كنت ترغب في القيام بالمخازن المؤقتة القابلة للضبط بالطريقة C ، فاستخدم malloc / free / realloc, والتي تتوفر في C ++. إذا كنت ترغب في القيام بمؤسسات C ++ ، فاستخدم متجهًا (أو deque, ، إذا كنت لا تحتاج فعليًا إلى تخزين متجاورة). لا تحاول خلط الاثنين باستخدام new[] بالنسبة للمخازن المؤقتة الخام ، ما لم تكن تنفذ حاوية تشبه المتجه.

جرب شيئًا كهذا:

typedef struct Board
{
    string name;
    int size = 0;
};

typedef struct tagRDATA
{
    vector <Board> myBoards(255);

    // Board DataBoard[255];
    int SelectedBoard;

} RUNDATA;

المتجه سوف يشكو. لهذا السبب لا يزال المصفوفات ، malloc و new.

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