具有非默认构造函数且不使用STL的对象数组

时间:2014-03-19 22:59:28

标签: c++ arrays

我想用非默认的Constructor创建一个对象数组。请注意,我不允许使用STL的矢量,我对此进行了研究并找到了一种方法:

Obj* p_obj[3];// for an array of 3 for example
// then allocate to each pointer using new
p_obj[0] = new Obj(10);
p_obj[1] = new Obj(15);
p_obj[2] = new Obj(20);

虽然当我尝试创建一个更大的数组(100个元素)时,我的程序会进入segFault。 如果有人建议我解决这个问题,我将不胜感激。

提前谢谢!

2 个答案:

答案 0 :(得分:1)

首先,您的代码完全正确。如果它崩溃了,那么其他地方一定是内存错误。

其次,通过单独分配如此多的小对象并使用双重间接,您的代码效率很低。向量的工作原理(默认情况下)的关键是 placement new 。用法示例:

Obj* objects = static_cast<Obj*>(operator new(sizeof(*objects) * n));
for (size_t i = 0; i < n; ++n)
    new (objects + i) Obj("Constructor arguments...")

删除时,必须在取消分配存储空间之前手动调用各个元素的析构函数。那是

for (size_t i = 0; i < n; ++n)
    objects[i].~Obj();
operator delete(objects);

建议使用RAII包装器进行上述分配和释放。

此外,为什么不允许你使用STL的vector

答案 1 :(得分:0)

好吧,如果你不能使用vector

struct myVector
{
private:
  Obj *p_obj;
  std::size_t size_;
public:
  myVector(): size_(0) 
  {
  }
  /*
  myVector(int const &size): size(size_)
  { 
    p_obj = new Obj[size_]; 
  }
  */

  ~myVector()
  { 
    if(size_ != 0)
    {
      delete[] p_obj;
    }
  }

  void resize(int const&size) 
  {
     // delete or append new memory
  }

  void push_back(int const &rhs)
  {
     // push here, check size and allocate needed memory
  }

  Obj *begin()
  {
     // Check size and return first element
  }

  Obj *end()
  {
     // Check size and return end element
  }
}

这是非常基本的东西,你也可以使用迭代器封装来节省很多麻烦。

如果这是针对课程的,那么根据vector功能提出自己的vector会很有用。