سؤال

يحرر: فقط لتوضيح الأمور ، كانت هذه المشكلة ناتجة عن خطأ مطبعي في الكود الخاص بي ، في

pointer = new BYTE(datasize);

كان ينبغي أن يكون

pointer = new BYTE[datasize];

كل شيء على ما يرام!

نهاية

أهلاً!

أواجه مشكلة تجاوز سعة المكدس غريبة في Visual Studio 2005 في مشروع C++..

في الكود الخاص بي، لدي

BYTE* pointer;

يتم تعيين هذا المؤشر على NULL، ثم يتم تخصيصه ببعض الذاكرة ثم مسحه إلى 0x00.مثل ذلك:

pointer = NULL;
pointer = new BYTE(dataSize);
memset(pointer,0x00,dataSize);

الآن، قمت بتشغيل هذا عدة مرات، وحصلت على نتيجتين مختلفتين.في بعض الأحيان (في جزء لاحق من البرنامج، عندما أقوم بحذف المؤشر باستخدام الحذف[]) تظهر رسالة تقول أن الكومة تالفة، وعند فحص مكدس الاستدعاءات، يبدو أن _CrtIsValidHeapPointer يؤكد أنه ليس مؤشرًا صالحًا .ومع ذلك، فقد تحققت من هذا المؤشر ويبدو أنه صالح بالنسبة لي (يحتوي على عنوان ذاكرة).هل فاتني شيء؟

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

 something.dll!_heap_alloc_base(unsigned int size=568)  Line 105 + 0x28 bytes   C
something.dll!_heap_alloc_dbg(unsigned int nSize=532, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608)  Line 411 + 0x9 bytes C++
something.dll!_nh_malloc_dbg(unsigned int nSize=532, int nhFlag=0, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608)  Line 268 + 0x15 bytes   C++
something.dll!_malloc_dbg(unsigned int nSize=532, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608)  Line 191 + 0x1b bytes    C++
something.dll!_calloc_dbg(unsigned int nNum=1, unsigned int nSize=532, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608)  Line 563 + 0x15 bytes   C++
something.dll!_getptd_noexit()  Line 608 + 0x18 bytes   C
something.dll!_errno()  Line 281 + 0x5 bytes    C
something.dll!_heap_alloc_dbg(unsigned int nSize=532, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608)  Line 415 + 0x5 bytes C++
something.dll!_nh_malloc_dbg(unsigned int nSize=532, int nhFlag=0, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608)  Line 268 + 0x15 bytes   C++
something.dll!_malloc_dbg(unsigned int nSize=532, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608)  Line 191 + 0x1b bytes    C++
something.dll!_calloc_dbg(unsigned int nNum=1, unsigned int nSize=532, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608)  Line 563 + 0x15 bytes   C++
something.dll!_getptd_noexit()  Line 608 + 0x18 bytes   C
something.dll!_errno()  Line 281 + 0x5 bytes    C
something.dll!_heap_alloc_dbg(unsigned int nSize=532, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608)  Line 415 + 0x5 bytes C++
something.dll!_nh_malloc_dbg(unsigned int nSize=532, int nhFlag=0, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608)  Line 268 + 0x15 bytes   C++
something.dll!_malloc_dbg(unsigned int nSize=532, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608)  Line 191 + 0x1b bytes    C++
something.dll!_calloc_dbg(unsigned int nNum=1, unsigned int nSize=532, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608)  Line 563 + 0x15 bytes   C++
something.dll!_getptd_noexit()  Line 608 + 0x18 bytes   C
something.dll!_errno()  Line 281 + 0x5 bytes    C
something.dll!_heap_alloc_dbg(unsigned int nSize=532, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608)  Line 415 + 0x5 bytes C++
something.dll!_nh_malloc_dbg(unsigned int nSize=532, int nhFlag=0, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608)  Line 268 + 0x15 bytes   C++
something.dll!_malloc_dbg(unsigned int nSize=532, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608)  Line 191 + 0x1b bytes    C++
something.dll!_calloc_dbg(unsigned int nNum=1, unsigned int nSize=532, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608)  Line 563 + 0x15 bytes   C++
something.dll!_getptd_noexit()  Line 608 + 0x18 bytes   C
something.dll!_errno()  Line 281 + 0x5 bytes    C

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

هل هناك خطأ ما في طريقة تخصيص/إلغاء تخصيص الذاكرة؟

أنا أستخدم هذا الرمز لإلغاء التخصيص:

if (pointer != NULL){
    delete[] pointer;
    pointer = NULL;
}

من المفترض أن يتأكد هذا من أنني لا أقوم بتحرير الذاكرة التي تم تحريرها بالفعل، أليس كذلك؟

شكرًا..

يحرر: في نافذة الإخراج، أحصل أيضًا على عدد كبير من هذه:

First-chance exception at 0x76df0839 in app.exe: 0xC0000005: Access violation reading location 0xfffffff8.
First-chance exception at 0x76e2871f in app.exe: 0xC0000005: Access violation reading location 0x00000004.
First-chance exception at 0x76e00a65 in app.exe: 0xC0000005: Access violation reading location 0xfffffff8.
First-chance exception at 0x76e00a65 in app.exe: 0xC0000005: Access violation reading location 0xfffffff8.
First-chance exception at 0x76e00a65 in app.exe: 0xC0000005: Access violation reading location 0xfffffff8.
First-chance exception at 0x76e00a65 in app.exe: 0xC0000005: Access violation reading location 0xfffffff8.
First-chance exception at 0x76e00a65 in app.exe: 0xC0000005: Access violation reading location 0xfffffff8.
First-chance exception at 0x76e00a65 in app.exe: 0xC0000005: Access violation reading location 0xfffffff8.
First-chance exception at 0x76e00a65 in app.exe: 0xC0000005: Access violation reading location 0xfffffff8.
First-chance exception at 0x76e00a65 in app.exe: 0xC0000005: Access violation reading location 0xfffffff8.
First-chance exception at 0x76e00a65 in app.exe: 0xC0000005: Access violation reading location 0xfffffff8.
First-chance exception at 0x76e00a65 in app.exe: 0xC0000005: Access violation reading location 0xfffffff8.
First-chance exception at 0x76e00a65 in app.exe: 0xC0000005: Access violation reading location 0xfffffff8.
First-chance exception at 0x76e00a65 in app.exe: 0xC0000005: Access violation reading location 0xfffffff8.
هل كانت مفيدة؟

المحلول

أعتقد أنك تقصد:

pointer = new BYTE[size];

نصائح أخرى

يجب أن يكون رمز إلغاء التخصيص الخاص بك:

if (pointer != NULL){
    delete[] pointer;
    pointer = NULL;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top