سؤال

لدي متطلبات ذاكرة عالية في التعليمات البرمجية ويتم تكرار هذا البيان عدة مرات:

Node** x;
x = new Node*[11];

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

أنا أقوم ببناء التعليمات البرمجية في Visual Studio. إنه يعمل بشكل جيد في وضع التصحيح (سواء في VS2005 و VS2008) ومع ذلك يلقي الخطأ في وضع الإصدار VS2005. EXE المباشر الذي تم إنشاؤه من CL Program.CPP Works إذا كان CL من VS2010 ولكنه يفشل عندما يكون من VS2005. أي أدلة؟

PS: Linux يعطيني خطأ في الحافلات (ملقاة الأساسية) لنفس الشيء

تحديث: وأعتقد أنه يمكن أن يكون الأمر بسبب "غير إجمالي" كما أفهم. لقد صنعت للتو من 11 إلى 12 (أو أي عدد منها) ويعمل !!! أنا لا أعرف لماذا. لا يعمل مع أرقام فردية!

تحديث 2: http://www.devx.com/tips/tip/13265. ?

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

المحلول

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

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

نصائح أخرى

لدي متطلبات ذاكرة عالية في التعليمات البرمجية

هل تنفد فعلا من الذاكرة؟

x = new Node*[11];

هل تحذف x مثل ذلك:

delete [] x;   // the correct way

أو:

delete x;  // incorrect

أو يمكن أن يكون هناك ببساطة شيء آخر إفساد كومة الكومة، على الرغم من أنني كنت أتوقع أن الجري في وضع وضع التصحيح سيجعله أكثر وضوحا، وليس أقل ذلك. ولكن مع الفساد الكومة هناك أي ضمانات نادرا ما تفعل ذلك في طريقة لطيفة وسهلة التصحيح.

لا حرج في هذا الرمز.

Node **x;
x = new Node*[11];

تقوم بتخصيص 11 مؤشرات إلى عقدة الفصل وتخزينها كمؤشر مزدوج في متغير x. هذا جيد.

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

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

سيقوم تطبيق Valid C ++ 98 بإلقاء استثناء (STD :: BAD_ALLOC) إذا فشل التخصيص، لا تعطل فقط. أوافق على الإجابات السابقة واقترح تشغيل برنامجك في Valgrind مثل هذا الريك من تلف الذاكرة. يجب أن تكون Valgrind متاحة في توزيع Linux الخاص بك.

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