[英]C++ pointers and arrays
我對動態數組有問題。
在頭文件類中,我有這個:
class CTerrain
{
...
CRock *rocks;
int numRocks;//=0
...
}
在cpp中,我有這個:
void CTerrain::Create()
{
numRocks = 0;
int NUM_ROCKS = rand()%10+1;
for(int i=0;i<NUM_ROCKS;i++)
{
rocks = new CRock;
numRocks++;
...
}
}
void CTerrain::Render()
{
for(int i=0;i<numRocks;i++)
rocks[i].render();//it works ok when here is 0 instead of 'i'
}
當我運行此代碼時,出現錯誤:OpenGL.exe中0x00913aea處未處理的異常:0xC0000005:訪問沖突讀取位置0x1c00001f。
感謝您的幫助,我已經嘗試解決此問題大約4個小時了...
編輯:
好的,所以我將Create()方法更改為:
void CTerrain::Create()
{
numRocks = 0;
int NUM_ROCKS = rand()%10+1;
rocks = new CRock[NUM_ROCKS];
for(int i=0;i<NUM_ROCKS;i++)
{
rocks[i].position = ...
numRocks++;
...
}
並且還添加了delete []岩石,現在可以正常工作了。
您的Create
函數將更像
void CTerrain::Create()
{
int NUM_ROCKS = rand()%10+1;
rocks = new CRock[NUM_ROCKS];
numRocks = NUM_ROCKS;
for(int i=0; i<NUM_ROCKS; i++)
{
rocks[i] = CRock{};
}
}
只是為以上答案添加一點解釋。 這里:
for(int i=0;i<NUM_ROCKS;i++)
{
rocks = new CRock;
numRocks++;
...
}
您要做的是,每次將CRock
新實例分配給指針rock
; 從而丟失了對舊對象的引用並導致內存泄漏。 使用Cyber提供的類似建議的解決方案。
rocks = new CRock;
您會CRock*
覆蓋該行中的CRock*
指針
用這個
rocks = new CRock[NUM_ROCKS];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.