重新分配作为实例成员的数组

时间:2014-06-29 22:20:46

标签: c++

这是this answer (which talks about regrowing a general array, not an array that is an instance variable, in particular)

的后续行动

我必须使用c风格的数组。

在下面的示例中,我的意思是oldArray包含T&#39。

T *newArray = new T[newCount];
if (oldArray) {
    std::copy(oldArray, oldArray + std::min(oldCount, newCount), newArray);
    delete[] oldArray;
}

假设oldArray是一个实例变量,我想重新生成它。这段代码给了我指向新增数组的指针,但如果我删除oldArray,我就不能再使用它了:(

2 个答案:

答案 0 :(得分:2)

我想你的意思是你不能在下一个代码中使用NAME oldArr。如果我理解你,我会为你提供下一个解决方案。您需要创建重新生成功能(" realloc"在我的代码中),然后在主代码中需要重新分配指针。

class T {
public:
    int x;
};

T* realloc( T* oldArray, int oldCount, int newCount ){
    T *newArray = new T[newCount];
    if (oldArray) {
        std::copy(oldArray, oldArray + std::min(oldCount, newCount), newArray);
        delete[] oldArray;
    }

    return newArray;
}

void main()
{
    int arr_size = 2;
    T* arr = new T[ arr_size ];

    arr[0].x = 10;
    arr[1].x = 20;
    std::cout<<"arr[0]="<<arr[0].x<<", arr[1]="<<arr[1].x<<"\n";

    int arr_new_size = 3;
    arr = realloc( arr, arr_size, arr_new_size );

    arr[2].x = 30;
    std::cout<<"arr[0]="<<arr[0].x<<", arr[1]="<<arr[1].x<<", arr[2]="<<arr[2].x;
}

答案 1 :(得分:0)

如果我正确理解了问题,您可以按原样使用参考中的函数。

oldArray = GrowArray(oldArray, oldCount, newCount);

可以将其修改为使用本地临时,然后使用std::swap,但这在很大程度上取决于使用它的上下文。