我想在C ++中创建一个不使用STL的对象数组。
我该怎么做?
我怎样才能创建Object2数组,它没有无参数构造函数(默认构造函数)?
答案 0 :(得分:34)
如果有问题的类型没有参数构造函数,请使用new[]
:
Object2* newArray = new Object2[numberOfObjects];
不要忘记在不再需要数组时调用delete[]
:
delete[] newArray;
如果它没有这样的构造函数,则使用operator new
来分配内存,然后就地调用构造函数:
//do for each object
::new( addressOfObject ) Object2( parameters );
同样,不要忘记在不再需要时解除分配数组。
答案 1 :(得分:13)
// allocate memory
Object2* objArray = static_cast<Object2*>( ::operator new ( sizeof Object2 * NUM_OF_OBJS ) );
// invoke constuctors
for ( size_t i = 0; i < NUM_OF_OBJS; i++ )
new (&objArray[i]) Object2( /* initializers */ );
// ... do some work
// invoke destructors
for ( size_t i = 0; i < NUM_OF_OBJS; i++ )
objArray[i].~Object2();
// deallocate memory
::operator delete ( objArray );
答案 2 :(得分:12)
假设您的类是Base,并且您有一个参数构造函数
Base arr[3] = {Base(0), Base(1), Base(2)} ;
答案 3 :(得分:5)
Object2 *myArray[42];
for (int i = 0; i < 42; i++)
{
myArray[i] = new Object2(param1, param2, ...);
}
稍后您将需要遍历数组并分别取消分配每个成员:
for (int j = 0; j < 42; j++)
{
delete myArray[j];
}
答案 4 :(得分:3)
使用指向Object2的指针数组:
std::tr1::shared_ptr<Object2>* newArray = new shared_ptr<Object2>[numberOfObjects];
for(int i = 0; i < numberOfObjects; i++)
{
newArray[i] = shared_ptr<Object2>(new Object2(params));
}
或者,不使用shared_ptr:
Object2** newArray = new Object2*[numberOfObjects];
for(int i = 0; i < numberOfObjects; i++)
{
newArray[i] = new Object2(params);
}
答案 5 :(得分:3)
您可以执行std::vector
所做的操作并创建一块原始内存。然后,您需要使用placement new构建在该内存中没有默认构造函数的对象。但是,当然,如果你这样做,你可能首先使用std::vector
。
答案 6 :(得分:0)
如果没有可用的默认构造函数,则需要一个指针数组,然后遍历该数组以初始化每个指针。
答案 7 :(得分:0)
显而易见的问题是为什么你不想使用STL。
假设你有理由,你可以用Obj * op = new Obj[4];
之类的东西创建一个对象数组。请记住用delete [] op;
删除它。
对于没有不带参数的构造函数的对象,你不能这样做。在这种情况下,我认为你能做的最好的事情是分配一些内存并使用新的位置。它并不像其他方法那么简单。
答案 8 :(得分:0)
如果你真的需要一个非默认可构造类型的数组(连续的对象序列),并且由于某种原因你需要用户std::vector
(!?),那么你必须使用原始分配函数和placement new
这很难做到可靠;这应该有助于说明原因。这个片段包含一些针对异常的防御,但很可能不会对所有失败产生强大的影响。
const size_t required_count = 100; //e.g.
// cast to pointer of required type needed for pointer arithmetic
Object2* objarray = static_cast<Object2*>(operator new(required_count * sizeof(Object2)));
size_t construction_count = 0;
try
{
while (construction_count < required_count)
{
// params could change with index.
new (static_cast<void*>(objarray + construction_count)) Object2(param1, param2);
++construction_count;
}
}
catch (...)
{
while (construction_count-- != 0)
{
try
{
(&objarray[construction_count])->~Object2();
}
catch (...)
{
// not a lot we can do here, log but don't re-throw.
}
}
operator delete(objarray);
throw;
}
// Now objarray has been allocated and pointer to an array of required_count Object2
// It cannot be de-allocated via delete[] or delete; you must loop through
// calling destructors and then call operator delete on the buffer.