帮助实现更改动态数组大小的函数

时间:2011-02-13 22:43:36

标签: c++

我正在尝试编写一个将动态数组大小更改为新大小的函数。在我的头文件中,我有:

Image **images; //pointer to a dynamic array of image pointers
int maximum; //size

我想通过分配一个新数组并在不更改其索引的情况下复制值来实现此目的。如果在newmax范围之外有非空指针,那么我们就无法做到这一点。所以我拥有的东西:

没有编译或运行时错误。但是,我发现新阵列的大小不正确。当我运行以下测试用例时:

我应该得到一个索引越界错误,但系统让它滑动。谁能看到这个错误?我已经找了好几个小时但却找不到任何东西。

2 个答案:

答案 0 :(得分:1)

  images=newArray;
  for (int i =0;i<newmax;i++)
        *images[i]=*newArray[i];

这很奇怪。 images和newArray现在是相同的,因此无需将newArray的内容复制回自身。那么删除这个循环?另外,需要添加:

 maximum = newmax;

如果'1'是索引,则应该导致

 firstScene->addpicture("red10.bmp", 1, 13, 72);

给出一个越界错误,而此刻它可能会出错?

答案 1 :(得分:0)

您应该将此功能提取到单独的类,并在该类型的Scene中具有数据成员:

struct ImagePtrVector {
  typedef Image *value_type;
  typedef int size_type;

  ImagePtrVector() : _begin (), _end (), _end_alloc () {}
  ~ImagePtrVector() {
    for (value_type x = _begin; x != _end; ++x) {
      delete *x;
    }        
    delete[] _begin;
  }

  // Either define these two yourself or mark private:
  ImagePtrVector(ImagePtrVector const &x);
  ImagePtrVector& operator=(ImagePtrVector const &x);

  value_type& operator[](size_type index) {
    assert(0 <= index);  // Or other checking as you like.
    assert(index < size());
    return _begin[index];
  }
  value_type const& operator[](size_type index) const {
    assert(0 <= index);  // Or other checking as you like.
    assert(index < size());
    return _begin[index];
  }

  size_type size() const { return _end - _begin; }
  size_type capacity() const { return _end_alloc - _begin; }

  void reserve(size_type capacity) {
    if (this->capacity() < capacity) {
      value_type *new_begin = new value_type[capacity];
      // Exception-safe only because I know the below won't throw.

      std::copy(_begin, _end, new_begin);
      _end_alloc = new_begin + capacity;
      _end = new_begin + this->size();
      delete[] _begin;
      _begin = new_begin;
    }
  }

  void resize(size_type size) {
    reserve(size);
    for (size_type diff = size - this->size(); diff > 0; --diff) {
      *_end++ = new Image();
    }
  }

  // Add push_back, begin/end, etc. to taste.

private:
  value_type *_begin, *_end, *_end_alloc;
};

与std :: vector和boost :: ptr_vector的区别并非巧合,您应该评估是否确实需要编写特殊容器或者可以重用现有的通用容器。