在C ++中扩展指针数组

时间:2012-04-02 16:34:31

标签: c++ arrays pointers dynamic

我是一个在C ++和指针中丢失的Java程序员:D

我有一个指向Bucket-Objects的指针数组

Bucket<E>* index = new Bucket<E>[2];

我像这样初始化它:

index[0] points to Bucket1
index[1] points to Bucket2

然后我希望将数组的大小加倍并链接其他条目,如下所示:

index[0] points to Bucket1
index[1] points to Bucket2
index[2] points to Bucket1
index[3] points to Bucket2

到目前为止我有这个代码,它会生成Bucket-Objects的副本,我不希望这样!

for (size_t i = 0; i < newSize; ++i)
{
    if (i < oldIndexSize)
       newIndex[i] = index[i];
    else
       newIndex[i] = index[i - oldIndexSize];

} 

4 个答案:

答案 0 :(得分:2)

  

我有一个指向Bucket-Objects的指针数组

不,你有一个指向Bucket对象数组的指针。指向Bucket对象的指针数组如下所示:

Bucket<E> * index[2];

动态分配给bucket对象的指针数组将按如下方式声明:

Bucket<E> ** index = new Bucket<E>*[N];

但你应该使用的是一个存储桶对象的共享指针向量,如下所示:

std::vector<std::shared_ptr<Bucket<E>>> index;

答案 1 :(得分:1)

不要重新发明轮子。如果需要可调整大小的数组,请使用std::vector<Bucket<E> >。如果您不希望复制存储桶,则必须使用一些间接寻址。例如,使用智能指针:

std::vector<std::shared_ptr<Bucket<E>>> index {std::make_shared<Bucket<E>>()/*, ...*/}

答案 2 :(得分:1)

  

我是一个在C ++和指针中丢失的Java程序员:D

在现代C ++中,很少使用原始指针。您应该更喜欢智能指针(例如shared_ptrunique_ptr)。这有几个好处,比如帮助使代码异常安全简化代码(例如资源被自动销毁和释放,不需要调用显式{{ 1}})等。

  

我有一个指向Bucket-Objects的指针数组

     

Bucket * index = new Bucket [2];

如果您共享存储在阵列中的delete个实例,则可以使用Bucket。否则,如果存在共享语义,则可能需要使用vector<unique_ptr<Bucket>>。您可以使用vector<shared_ptr<Bucket>>方法将vector::push_back()的新实例添加到向量中,该实例将动态增长。 如果您选择使用Bucket智能指针,请使用shared_ptr<>而不是原始Bucket分配make_shared的实例。

在Visual C ++团队中工作的STL维护者有一个非常有趣的STL lessons on Channel 9系列。您可能需要考虑part 1 (sequence containers)part 3 (smart pointers)

答案 3 :(得分:0)

如果它是一个指针数组,它将不会创建对象的副本,它将只是一个指针的副本,似乎这个代码可以完成你想要的东西。