2015-02-11 211 views
1

我正在嘗試編寫一個C++類,其中有一些指向int的指針作爲私有成員。 我在嘗試時的值賦給指針地址此異常:將指針聲明爲類成員C++

Unhandled exception at 0x000B140A in test.exe: 0xC0000005: Access violation  writing location 0x00000000. 

這裏是將重現我的機器上的問題的代碼,其最小量

#include "stdafx.h" 

class Chunker { 
    public: 
    Chunker(int cx, int cy); 

    private: 
    int chunkSizeX, chunkSizeY; 
    int *yOff, *xOff; 
    }; 

Chunker::Chunker(int cx, int cy){ 
    chunkSizeX = cx; 
    chunkSizeY = cy; 
    *xOff = 0; 
    *yOff = 0; 
}; 

int main(int argc, char *argv) 
{ 
    Chunker chunker(12, 12); 
    return 0; 
} 

我做不到弄清楚這裏有什麼問題?

+2

你在下面有一個很好的答案,但你爲什麼在這裏首先使用指針? – Quentin 2015-02-11 16:00:01

+0

指針是因爲在完整的代碼中有一個函數,每次調用都會返回數組的下一個'塊'。 xOff和yOff指針將指向正在跟蹤它在數組中的位置的整數。 – jramm 2015-02-11 16:04:53

+2

那麼xOff和yOff是一些數組的索引器?您可以將它們定義爲整數,並將它們用作'myXArray [xOffset]' – tofi9 2015-02-11 16:11:48

回答

7

您需要的地方爲你的指針

Chunker::Chunker(int cx, int cy) 
    : chunkSizeX{cx}, 
    chunkSizeY{cy} 
{ 
    xOff = new int(0); 
    yOff = new int(0); 
} 

否則,你將值分配給那個還沒有一個地址的指針聲明的記憶。

顯然,如果你的類是分配內存中的一個,你需要把它清理乾淨太

Chunker::~Chunker() 
{ 
    delete xOff; 
    delete yOff; 
} 

如果你的類是一個分配內存,你可能還需要考慮其成員是

std::unique_ptr<int> xOff; 
std::unique_ptr<int> yOff; 
+0

非常感謝。與C.有點不同 – jramm 2015-02-11 16:05:33

2

替代@ Cuber的答覆是xOff = nullptr;更換*xOff = 0;(不*)。但爲什麼指針?

Chunker::Chunker(int cx, int cy) 
    : chunkSizeX{cx}, 
    chunkSizeY{cy} 
{ 
    xOff = nullptr; 
    yOff = nullptr; 
} 

... 

Chunker::~Chunker() 
{ 
    delete xOff; 
    delete yOff; 
}