أنت غير متصل حاليًا، وفي انتظار الإنترنت الخاص بك ليقوم بإعادة الاتصال

FIX: تحرير عدة مرات قد يؤدي في Visual C++ خطأ في التطبيق

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

اضغط هنا لرابط المقالة باللغة الانجليزية194550
الأعراض
قد يؤدي الذاكرة التي يتم تحرير عدة مرات على خطأ في تطبيق.

ملاحظة: هذا يتحقق ما إذا كنت تستخدم malloc و متعددة الحرة أو جديدة وحذف متعددة.
السبب
يتم تعديل بنيات تحكمية كومة الذاكرة المؤقتة بعد الاستدعاء الأول free() ثم لم تعد في حالة حيث يعمل الاستدعاءات التالية إلى free().
الحل
تجنب استدعاء الحرة متعددة أو حذفها متعددة على نفس المؤشر. أحد الطرق لمنع هذا عن طريق تعيين المؤشر فارغة بعد استدعاء الحرة أو حذفها. حذف والدالات الحرة بإرجاع دون بأي شيء إذا تمرير مؤشر فارغة كوسيطة. لم يفلح ذلك في الحالات حيث الحرة أو حذف يسمى على مؤشرات متعددة تشير إلى نفس الموقع الذاكرة.

أصدرت Microsoft DLL مكتبة وقت تشغيل C جديد ، Msvcrt.dll بتنفيذ مديري كومة الذاكرة المؤقتة اثنين "و" إدارة كومة الذاكرة المؤقتة متوافق 5 Visual C++ "و" إدارة كومة الذاكرة المؤقتة متوافق 6 Visual C++ لمساعدة العملاء على مواجهة هذه المشكلة في تطبيقات الجهة الخارجية الخاصة بهم. يكشف مع الإصدار Visual C++ اعتمد التطبيق الخاص بك ثم يستخدم إدارة كومة الذاكرة المؤقتة المناسبة من أجل ذلك التطبيق. إذا كان هذا الإصدار 6.0 أو أكبر, يتم استخدام إدارة كومة الذاكرة المؤقتة متوافق 6 Visual C++ و إذا كانت أقدم من الإصدار 6.0 يُستخدم كومة الذاكرة المؤقتة متوافق 5 Visual C++.

6.0 Visual Studio يمكن للمستخدمين الوصول هذا msvcrt.dll جديد عن طريق تثبيت أحدث Microsoft Visual Studio حزمة خدمة. يجب على المستخدمين بدون Visual Studio تثبيت تحديث Microsoft مكتبات.
تصريح
أقرت Microsoft أن هذا خطأ في Microsoft المنتجات المسردة في بداية هذه المقالة.
تم تصحيح هذه الأخطاء في Visual Studio 6.0 المزود بحزمة الخدمة Service Pack 3. لمزيد من المعلومات حول حزم الخدمة Visual Studio الرجاء مراجعة المقالات التالية في "قاعدة معارف Microsoft:

194022خدمة Visual Studio 6.0 حزمة ما, حيث لماذا

194295كيفية معرفة تثبيت حزمة خدمة Visual Studio
معلومات أخرى
تحرير عدة مرات ينتج عن السلوك غير معرّف.

إنشاء إصدار من نموذج التعليمة البرمجية أسفل السبب خطأ في تطبيق عند إنشاء مع 6.0 Visual C++; التعليمة البرمجية لا يتسبب خطأ في تطبيق عند إنشاء مع 5.0 Visual C++.

ينشئ التصحيح باستخدام إما Visual C++ 6.0 أو 5.0 Visual C++ بإصدار ASSERT:
   Debug Assertion Failed!				

من المهم لاحظ أن حالة "كومة كتلة صغيرة" (SBH) قيد flux باستمرار. وبسبب ذلك، هناك حالات حيث من الممكن إصدار لا التوكيد في الإنشاء التصحيح ولكن يحدث خطأ في تطبيق في إنشاء الإصدار.

نسخ الإصدار في 6.0 Visual C++ حساسة أكثر لتحرير الذاكرة من عدة مرات في 5.0 Visual C++. إذا تم إنشاؤها بواسطة مع 5.0 Visual C++ ، الحالة أدناه حيث يتم الاستدعاء غير صحيحة لتحرير innocuous. إذا تم إجراء استدعاء free() بعيد أكثر من الأصلي, من الممكن حدوث خطأ في تطبيق. هناك احتمال كبير تالف تلك الذاكرة.

نموذج التعليمات البرمجية

   // Compile options for Release builds /c   // Compile options for Debug builds /c /Zi   #include <malloc.h>   int main(int argc, char* argv[])   {      char *pChar1 = (char *)malloc(10*sizeof(char));      char *pChar2 = (char *)malloc(10*sizeof(char));      free(pChar1);      free(pChar1);      return 0;   }				
kbVS600sp2 msvcrt.dll

تحذير: تمت ترجمة هذه المقالة تلقائيًا

خصائص

رقم الموضوع: 194550 - آخر مراجعة: 06/04/2005 20:14:16 - المراجعة: 3.0

Microsoft Visual C++ 6.0 Enterprise Edition, Microsoft Visual C++ 6.0 Professional Edition, Microsoft Visual C++, 32-bit Learning Edition 6.0

  • kbmt kberrmsg kbqfe kbbug kbcode kbcrt kbfix kbvs600sp2fix kbvs600sp3fix KB194550 KbMtar
تعليقات
tml>t> /html>script> c picker" ms.cmpnm="loc picker">
yle="display: none; " src="https://c1.microsoft.com/c.gif?DI=4050&did=1&t=">cking = 1; var varCustomerTracking = 1; var Route = "76500"; var Ctrl = ""; document.write("