我想用非默认的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。 如果有人建议我解决这个问题,我将不胜感激。
提前谢谢!
答案 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
会很有用。