2012-08-29 68 views
0

C++ newb here。我正在嘗試使用指針來編寫我自己的數組實現,並且我碰到了一堵牆,我不知道如何克服。用指針算術釋放內存

我的構造函數拋出這個錯誤

array.cpp:40:35: error: invalid conversion from ‘int*’ to ‘int’ [-fpermissive] 

當我的數組初始化我希望它騰出數組整數中的所有空間。

Array::Array(int theSize){ 
size = theSize; 
int *arrayPointer = new int; 
int index = 0; 
while(theSize > index){ 
    *(arrayPointer + index) = new int; //This is the trouble line. 
    ++index; 
} 
} 

我在做什麼錯了stackoverflow?

+7

那麼,對於初學者,你試圖單獨分配每個元素,當有一個內置的'new int [size]'語法來分配數組時;-) – Cameron

+0

使用'new int [size]'也同樣糟糕(可能更糟糕)。對於一個容器,你通常希望使用'buffer = operator new(size);'來分配原始存儲空間,接着放置new以在該空間中創建對象:'new(buffer + pos)int(value);' 「int」很少,但其他類型更多。 –

+1

由於這個問題經常出現,並且幾乎總是會產生一些我認爲大部分都是錯誤的答案,所以我寫了一篇[博客文章](http://coderscentral.blogspot.com/2012/08/c-dynamic-arrays)。 HTML)關於我認爲更好的方式來處理這個問題。 –

回答

1

arrayPointer點到單個int,它不指向的int*陣列,其中該線路將需要:

*(arrayPointer + index) = new int; 

*(arrayPointer + index)類型是int,因此編譯錯誤。

要分配的陣列的int

int* arrayPointer = new int[size]; 

如果這是爲了初始化一個成員變量,則:

arrayPointer = new int[size]; 

否則arrayPointer將是本地的構造函數。由於該類現在擁有一個動態分配的成員,因此您需要實現複製構造函數和賦值運算符,或者防止複製(請參閱What is The Rule of Three?)。請記住在析構函數中使用delete[] arrayPointer


只要提及std::vector<int>,即使這是一個學習練習。

+0

我試過新的int [size],程序投了。是否有我需要使用的包含? – Breedly

+0

您是否在構造函數中重新聲明'arrayPointer'(請參閱更新後的答案)? – hmjd

+0

仍然投擲,忘記發佈錯誤。 'array.cpp :(。text + 0x1c):對運算符new [](unsigned int)的未定義引用'' 感謝您的鏈接,我會更多地閱讀它。 – Breedly

0

你提到的試圖設置一個INT *成INT變種的線=>解引用一個INT *提供一個INT:

*(arrayPointer + index) // is a int 

無論如何要在存儲器移動(和解除引用存儲器)你避難所」 t保留。因此,您可以通過執行此指令來訪問受保護的內存區域。

替換所有構造函數:

Array::Array(int theSize) 
{ 
    size = theSize; 
    arrayPointer = new int[theSize]; // Replace your local var with a member one. Else you will lose your array ;) 
} 
1

如下操作:

#include <cstddef> 

template <typename T> 
class Array 
{ 

public: 

    T* const arrayPointer; // arrayPointer can't be reallocated 
    const size_t size; // size can't change 

    Array(const int theSize) : arrayPointer(new T[theSize]), 
           size(theSize) {} 

    ~Array() { 
     delete[] arrayPointer; 
    } 

private: 

    Array(const Array& other) {} // forbid copy 

    Array& operator= (const Array& other) {} // forbid assignment 

} ; 
  • 爲什麼使用template <typename T>?所以你可以有任何類型的數組。
  • 爲什麼要使用new T[ theSize ]?所以你可以同時分配theSize元素。
  • 爲什麼要使用: arrayPointer(new T[ theSize ])?因此,如果分配失敗(由於大的大小),對象失敗,沒有初始化。它被稱爲RAII。
  • 爲什麼要使用delete [] arrayPointer?因爲你使用new[],你必須釋放整個數組。
  • 爲什麼這些const的?避免任何人改變數組的大小並使字段不一致。
  • 這些私人方法是什麼?他們禁止拷貝,所以沒有人可以製作array1 = array2; delete array2;,什麼會釋放array1的arrayPointer。

使用(它會分配陣列10 INT的:)

Array<int> arr(10) ; 

訪問:

arr.arrayPointer[ 0 ] = 5 ; 

注 - 您可以在範圍0..9細胞訪問arrayPointer。您可以將operator[]添加到您的班級,以避免使用arrayPointer並使用arr[ 0 ]

+0

這也是一個很好的答案,但它有點超出了範圍。在接下來的幾天裏,你也應該對自己感覺良好! – Breedly

+0

@Breedly:我剛剛開始對自己感覺良好;)說真的,既然你是C++的新手,那麼爲什麼不開始正確的方式呢?既然你想實現你自己的數組,我認爲它是最好也是最安全的方法。用C++玩得開心。 – Grzegorz

+0

@Grzegorz不錯的東西教,但也許爲時尚早。現在你已經證明他需要一個析構函數,你可能需要談論三條規則,否則它不會是「最好和最安全的方式」。 –