2017-10-17 269 views
-2

有人可以解釋爲什麼當我回來形式的功能,我從tabOfOffsets丟失我的數據。我做了兩次相同的事情,只有第二個數組的程序崩潰。 我在函數的最後打印了這個數組的值,並且一切都清晰而正確。也許我在刪除某處出錯了? 下面是代碼。C++分配內存

#include<iostream> 
#include <algorithm> 

using std::cout; 
using std::endl; 

void changeSizeOfVector(int *tabValue, int *tabOffsets, int &oldSize, int 
newSize) { 
int temp = std::min(oldSize, newSize); 

int *newTabOfValues = new int [newSize] {0}; 
int *newTabOfOffsets = new int [newSize] {0}; 

for (int i = 0; i < temp; i++) { 
    newTabOfValues[i] = tabValue[i]; 
    newTabOfOffsets[i] = tabOffsets[i]; 
} 

delete[] tabValue; 
delete[] tabOffsets; 

tabValue = new int [newSize] {0}; 
tabOffsets = new int [newSize] {0}; 



for (int i = 0; i < newSize; i++) { 
    tabValue[i] = newTabOfValues[i]; 
    tabOffsets[i] = newTabOfOffsets[i]; 
    std::cout << tabOffsets[i] << tabValue[i] << endl; 
} 

oldSize = newSize; 
delete[] newTabOfValues; 
delete[] newTabOfOffsets; 
for (int i = 0; i < newSize; i++) { 
    std::cout << tabOffsets[i] << tabValue[i] << endl; 
} 

} 
int main() { 

int SIZE = 10; 

int * tabOfOffsets = new int[SIZE]; 
int * tabOfValues = new int[SIZE]; 

for (int i = 0; i < SIZE; i++) 
{ 
    tabOfValues[i] = i; 
    tabOfOffsets[i] = i; 
    cout << tabOfValues[i] << " : " << tabOfOffsets[i] << endl; 
} 

changeSizeOfVector(tabOfValues, tabOfOffsets, SIZE, 12); 


for (int i = 0; i < SIZE; i++) { 
    cout << tabOfOffsets[i] << " : " << tabOfValues[i] << endl; 

} 
delete[] tabOfOffsets; 
delete[] tabOfValues; 

}

+3

獲得一些[良好的初學者書](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list),並閱讀*參考*和如何通過參數*參考*。 –

+1

不要使用指向數組的指針。這是C風格的編程。使用'std :: vector'並通過引用傳遞。 – JHBonarius

+1

在瞭解了參考資料並知道如何解決您的程序後,請考慮您所做的*雙重複制。爲什麼不簡單地*分配*指針?像'tabValue = newTabOfValues'?一旦你考慮並實施並測試了這些,將你的程序扔掉並學習如何使用['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)。 –

回答

0

這個函數的聲明是錯誤的:

void changeSizeOfVector(int *tabValue, int *tabOffsets, int &oldSize, int 
newSize); 

這意味着你可以改變的tabOffsets值而不是指針本身,以使其行爲正確,你應該把它聲明如下:

void changeSizeOfVector(int *tabValue, int **tabOffsets, int &oldSize, int 
newSize); 

這樣你可以改變指針本身併爲其分配一個新分配的數組。

+0

這確實回答了他的問題......但是迴避他編程C風格的觀點,同時他可以使用STL等。 – JHBonarius

+0

謝謝。你讓我今天一整天都感覺很好 ;)。順便說一句,我知道我可以使用STL,但我有這個例子,我想知道爲什麼它不工作。 – Sewer