ورود

View Full Version : دو آرایه روی هیپ



kochol
دوشنبه 06 آذر 1385, 17:26 عصر
سلام
من کاری که می خواهم انجام بدم به این شکل هست که دو تا Pointer دارم به شکل زیر.


Struct* V1 = new Struct[100];
Struct* V2 = new Struct[100];

در طول برنامه مقادیری را می گیرند.
بعد می خواهم که V1 را از روی هیپ پاک کنم و به جای اون V2 را قرار بدم از کد زیر استفاده کردم ولی موقع اجرا std::bad_alloc می ده.


delete[] V1;
V1 = V2;


البته کد اصلی رو هم براتون می زارم ولی لطفا مرا راهنمایی کنید که ایراد از کجاست.



Vertex3TN* Temp = new Vertex3TN[m_pMeshes[x].m_NumVerts];
memcpy(Temp, m_pMeshes[x].m_pVerts, m_pMeshes[x].m_NumVerts*sizeof(Vertex3TN));
...
...
...
delete[] m_pMeshes[x].m_pVerts;
m_pMeshes[x].m_pVerts = Temp;

sh_roohani
سه شنبه 07 آذر 1385, 09:44 صبح
سلام kochol جان،

m_pMeshes[x].m_pVerts رو با malloc گرفتی یا با new؟ آخه std::bad_alloc که می دونی مال تخصیص حافظه س، نه مال آزاد سازی اون یا نسبت دادن یه Pointer به یه Pointer دیگه. البته در مثال اول دیدم که با new گرفتی، ولی چون در کد اصلی نبود محض محکم کاری می پرسم. بعلاوه، آیا مقدار m_pMeshes[x].m_NumVerts رو Trace کردی؟ شاید توش garbage باشه (با یه مقدار خیلی بالا) و Heap manager نتونه اون همه حافظه رو تخصیص بده که همچین exceptionی می ده.

kochol
سه شنبه 07 آذر 1385, 09:58 صبح
سلام
من اول با memcpy این کارو انجام می دادم درست کار می کرد یعنی Temp می ریختم تو m_pMeshes[x].m_pVerts.
بله من m_pMeshes[x].m_pVerts را با new درست کرده ام.

بله این مقدار m_pMeshes[x].m_NumVerts هم کاملا صحیح هست.

کد قبلی که می نوشتم و کار می کرد این بود.


623 Vertex3TN* Temp = new Vertex3TN[m_pMeshes[x].m_NumVerts];
624 memcpy(Temp, m_pMeshes[x].m_pVerts, m_pMeshes[x].m_NumVerts*sizeof(Vertex3TN));
...
...
...
637 m_pMeshes[x].Render();
638 memcpy(m_pMeshes[x].m_pVerts, Temp, sizeof(Vertex3TN)*m_pMeshes[x].m_NumVerts);
639 delete[] Temp;

کل کد هم در آدرس زیر هست و این کد مربوط به آخرین تابع می شه شماره خط بالا هم می تونه کمکتون کنه.
http://kge.cvs.sourceforge.net/kge/KGE3/Source/gfx/sn/MeshMS3D.cpp?view=markup

sh_roohani
سه شنبه 07 آذر 1385, 10:10 صبح
راستش یه خورده گیج شدم. کدت Multi-thread نیست؟ منظورم اینه که یه Thread دیگه هم به m_pMeshes[x].m_pVerts دسترسی داشته باشه و پیش از Thread جاری، اونو release کنه؟

kochol
سه شنبه 07 آذر 1385, 20:23 عصر
سلام
نه اصلا این طور نیست مولتی ترید نیست.
راستش خودم هم گیج شدم چون با این چیزهایی که من می دونم این کد نباید مشکلی داشته باشه.
این کد برای انیمیشن مدلم هست فریم اول رو می کشه و بعد اون ارور رو می ده.

بعد من مطمینم که این خطا از جای دیگری نیست.

kochol
سه شنبه 07 آذر 1385, 22:40 عصر
سلام
من یه برنامه برای تست نوشتم که به درستی کار می کرد واقعا نمی دونم مشکل از کجاست.


#include <stdio.h>


int main()
{
int* a;
int* b;
a = new int[2];
a[0]=1;
a[1]=2;
b = new int[2];
b[0]=3;
b[1]=4;

delete[] a;
a = b;

printf("%d %d\n",a[0],a[1]);
} // main
خروجی هم 3 و 4 بود.
واقعا عجیبه مگه نه؟

سپول
سه شنبه 14 آذر 1385, 13:44 عصر
هر گونه routine و function رو از تو Structure های VertexTN و اینها بردار ببین درست می شه یا نه.
یعنی structure ها فقط member variable داشته باشند.