2017-10-17 95 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