2012-12-08 53 views
1

我有一個GameObject其中包含一個Shapes數組(通過malloc分配)。形狀在其中有一個點的列表,可以繼承爲多邊形。 初始密碼:訪問衝突malloc和繼承C++

GameObject g1(true, true); 
    Color c(0, 0, 1, 0); 
    Point p(100, 100, 0); 
    Polygon s(p, c); 
    s.addPoint(p); 
    s.createRegularShape(4, 50.0f); 
    g1.addShape(s); 

這是在標題中。

Shape* shapes; 

這是它打破了(當我試圖訪問數據)

void GameObject::draw(unsigned int gameTime) 
{ 
    if(visible) 
    { 
     for(int i = 0; i < count; i++) 
     shapes[i].draw();//Access violation happens here 
    } 
} 

我這是怎麼了形狀添加到形狀的數組。

void GameObject::addShape(Shape const& shape) 
{ 
    if(count == size) 
    { 
     size += 4; 
     shapes = (Shape*)realloc(shapes, sizeof(Shape) * size); 
    } 
    shapes[count] = shape; 
    count++; 
} 

這是我爲Shape分配內存的地方。當我們需要分配內存給shapes數組時,這在構造函數中被調用。

void GameObject::clearShapes(int size) 
{ 
    if(count > 0) 
     free(shapes); 
    shapes = (Shape*)malloc(sizeof(Shape) * size); 
    count = 0; 
    GameObject::size = size; 
} 

所以基本上,我做錯了什麼?我如何從這段代碼中獲得訪問衝突?數據似乎都是正確的大小,並且是合法的。

+0

你爲什麼使用malloc?這是C++。使用'std :: vector <>'。修復代碼毫無意義。扔掉它,忘記所有關於malloc。假裝你從來沒有聽說過它 –

回答

2

當您使用malloc()時,不會運行對象的構造函數。正如你所猜測的,這可能會造成各種各樣的問題。改爲使用new

不要在C++中使用malloc()來創建對象。

此:

Shape* shapes; 

Shape是對象的數組,Shape指針的數組。這意味着初始內容:

shapes = (Shape*)malloc(sizeof(Shape) * size); 

後來:

shapes = (Shape*)realloc(shapes, sizeof(Shape) * size); 

不構成。所以,當你以後做:

shapes[count] = shape; 

賦值運算符是呼籲shapes[count],這是一種非構造Shape。它看起來像你在這裏成爲未定義的行爲。任何類型的運行時錯誤都是可能的。

擺脫malloc()和realloc(),而是使用std::vector<Shape>push_back()新的形狀。如果你想保持與普通動態數組這樣做,那麼你應該切換到數組的指針來代替:

Shape** shapes; 

而且,只有在那裏舉行Shape指針。這當然需要重構你的程序邏輯,我不明白你爲什麼要繼續使用malloc()和realloc()。

+1

我沒有用它來創建對象。我正在使用它爲數組分配內存。 – Matthew

+0

改爲使用'operator new []'。或者,如果你絕對**必須**使用'malloc',那麼在使用之前必須使用放置'new'來初始化數組的每個索引。 –

+0

@Mthethew我更新了我的答案。 –