2016-02-14 85 views
-1

空隙扩大()C++创建Vector类

这个函数将加倍向量的容量。这个函数应该为动态分配的数组重新分配内存并更新容量的值。在调用expand()之前,请注意在容量为0时正确处理这种情况。

确保你不在这里创建内存泄漏。

空隙扩大(无符号量)

该功能将扩大由传入的量向量的容量。此功能应该重新分配存储器的动态分配的数组和更新能力的值。

确保你不在这里创建内存泄漏。

我想回答完成这些功能,但我似乎无法让它工作。这是迄今为止的代码。

void IntVector::expand() { 
    cap = cap * 2; 
    int *temp = new int[cap]; 
    for(unsigned i = 0; i < sz; ++i) { 
     temp[i] = data[i]; 
    } 
    delete [] data; 
} 

void IntVector::expand(unsigned amount) { 
    cap = cap + amount; 
    int *temp = new int[cap]; 
    for(unsigned i = 0; i < sz; ++i) { 
     temp[i] = data[i]; 
    } 
    delete [] data; 
} 

我也有专用数据字段:

-unsigned SZ:存储intVector的的(当前所用元件的数目)的尺寸。

-unsigned帽:存储阵列

-int的大小*数据:存储整数

我似乎无法找出问题的动态分配的数组的地址。

太谢谢你了。

+0

请发表最小的,完全,可核查例。就目前而言,你的问题是无关紧要的。 –

回答

0

add data = temp;删除后[]数据;事实上,你需要做更多的事情来处理分配内存失败的问题。

+0

我还需要做什么? – Trey

0

忘了分配tempdata

而且您应该检查amount是否等于0,并且不需要在两个函数中实现相同的逻辑。

void IntVector::expand() { 
    expand(cap); 
    ~~~~~~~~~~~~ 
} 

void IntVector::expand(unsigned amount) { 
    if (amount <= 0) return; 
    ~~~~~~~~~~~~~~~~~~~~~~~~ 
    int *temp = new int[cap + amount]; 
    for(unsigned i = 0; i < sz; ++i) { 
     temp[i] = data[i]; 
    } 
    cap = cap + amount; 
    delete [] data; 
    data = temp; 
    ~~~~~~~~~~~~ 
} 
+0

是我唯一缺少的东西吗? – Trey

+0

@Trey请参阅我编辑的答案。 – songyuanyao

0

这里有两个问题:

  1. 无法将data成员从temp分配:
  2. 更改成员变量,如cap你确信你能成功地分配内存之前。

对于上述第2项),如果new[]引发异常,则通过更改cap成员来损坏它。

以下是更正:

void IntVector::expand() { 
    int *temp = new int[cap * 2]; 
    cap *= 2; // <-- Set this after you've allocated 
    for(unsigned i = 0; i < sz; ++i) { 
     temp[i] = data[i]; 
    } 
    delete [] data; 
    data = temp; // <--- Failed to do this 
} 

void IntVector::expand(unsigned amount) { 
    int *temp = new int[cap + amount]; 
    cap += amount; // <-- Set this after you've allocated 

    for(unsigned i = 0; i < sz; ++i) { 
     temp[i] = data[i]; 
    } 
    delete [] data; 
    data = temp; // <--- Failed to do this 
}