C ++,没有<vector> </vector>的对象数组

时间:2010-03-22 15:24:07

标签: c++ arrays

我想在C ++中创建一个不使用STL的对象数组。

我该怎么做?

我怎样才能创建Object2数组,它没有无参数构造函数(默认构造函数)?

9 个答案:

答案 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.