2012-01-24 85 views
0

的Visual C++,微軟的Visual Studio 2010速成:從這個malloc的一個類中C++訪問浮動指針 - >訪問衝突

訪問工作:

float* block = (float *)_aligned_malloc(32 * sizeof(float), CACHE_ALIGNMENT); 
block[0] = (float)30; // I work fine. 

但是,當它是這個類中,它不起作用:

class Test 
{ 
    private: 
     //static const int numberOfElements = 1024; 

    public: 
     float* block1; 
     float* block2; 

    // Constructor 
     Test::Test(int nElements) 
     { 
      float* block1 = (float *)_aligned_malloc(nElements * sizeof(float), CACHE_ALIGNMENT); 
      float* block2 = (float *)_aligned_malloc(nElements * sizeof(float), CACHE_ALIGNMENT); 
     } 
    // Destructor 
     Test::~Test(void) 
     { 
      _aligned_free(block1); 
      _aligned_free(block2); 
     } 
}; 

... 

Test testClass = Test(32); 
testClass.block1[0] = (float)30; // Access violation! 

... 

或者,如果聲明爲指針,同樣的事情(這是我第一次嘗試它):

Test* testClass = new Test(32); 
testClass.block1[0] = (float)30; // Access violation! 

什麼我在當浮子*是一個類中定義訪問值方面做錯了什麼?問題是別的嗎?

+1

看在上帝的份上,用'std :: vector '而不是'float *' –

+0

@sad_man,不確定上帝是否關心手頭的問題。 –

+0

如果你真的必須嘗試自己管理記憶,請記住[Rule of Three](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-ree)。雖然這只是這裏的一個錯誤。 –

回答

4

您將賦值給構造函數的局部變量,而不是成員變量。嘗試類似

Test::Test(int nElements) 
    { 
     block1 = (float *)_aligned_malloc(nElements * sizeof(float), CACHE_ALIGNMENT); 
     block2 = (float *)_aligned_malloc(nElements * sizeof(float), CACHE_ALIGNMENT); 
    } 

並檢查值以確保分配成功。

+0

並增加警告等級 – PlasmaHH

+0

@PlasmaHH真實的,應該有關於暗影成員的警告。 –

+0

或更廣泛(取決於編譯器)「設置但未使用的變量」 – PlasmaHH

0

對構造函數局部變量block1block2的聲明會影響成員變量block1block2

使用g++您可以通過-Wshadow選項獲得此警告。對於Visual Studio,恐怕沒有辦法警告變量何時會影響另一個變量。

+0

是的,你也是正確的,我沒有警告級別4設置(警告未使用的變量)。謝謝。 – user1166780