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

C++ 具有非默认构造函数且不使用STL的对象数组,c++,arrays,C++,Arrays,我想用非默认构造函数创建一个对象数组。请注意,我不允许使用STL中的vector,我对此进行了研究并找到了一种方法: 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个元素)时,我的程

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

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个元素)时,我的程序出错了。 如果有人能给我一个解决这个问题的好办法,我将不胜感激


提前谢谢你

如果你不能使用向量

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
会很有用

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

其次,您的代码是低效的,因为它单独分配了许多小对象,并且使用了双间接寻址。矢量如何工作(默认情况下)的关键是“放置新”。用法示例:

Obj* objects = static_cast<Obj*>(operator new(sizeof(*objects) * n));
for (size_t i = 0; i < n; ++n)
    new (objects + i) Obj("Constructor arguments...")
Obj*objects=static_cast(新操作符(sizeof(*objects)*n));
对于(尺寸i=0;i
删除时,必须在释放存储之前手动调用单个元素的析构函数。就是

for (size_t i = 0; i < n; ++n)
    objects[i].~Obj();
operator delete(objects);
(大小i=0;i 对象[i]。~Obj(); 操作员删除(对象); 建议使用RAII包装器来执行上述分配和解除分配


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

请发布带有错误的代码有任何理由拒绝使用标准库吗?这是一个学习练习?@Manu343726:这是一个家庭作业@Bryan Chen:有很多东西要发布。我只想保证这种方法是正确的correct@Oleksandr您发布的代码没有理由会崩溃,因此我们需要更多信息。嗯,没有。新的Obj[size_uj]要求Obj有一个默认构造函数。此外,myVector(){}将导致崩溃,因为它使p_Obj未初始化。不要那样做。为什么要通过常量引用传递整数呢。。。为该特定功能添加了推回功能。。。也有访问权限的私有指针。。。以这种速度,我们将最终创建vector类。。。我认为如果这是作业,他应该自己定义方法。。。你不这么认为吗?哦,我认为这种情况下,通过值或引用传递是不相关的,但是我没有改变里面的参数,所以它更清晰。自2013年起,该标准没有提及任何内容。矢量头文件是一个包含其他7个头文件的头文件,stl_矢量是一个超过1400行的模板。目的是帮助他,但不是完全给出解决方案,也不是让他完全放弃。阅读标准是一回事,阅读标准中的代码是另一回事。这太过分了。