C ++:使用非默认构造函数动态分配结构的成员数组

时间:2011-05-26 22:53:38

标签: c++ arrays constructor struct memory-management

如果我有:

struct a_struct
{
    int an_int;

    a_struct(int f) : an_int(f) {}
    a_struct() : an_int(0) {}
};

class a_class
{
    a_struct * my_structs;

    a_class() {...}
};  

我能做到:

a_class() {my_structs = new a_struct(1)}
//or  
a_class() {my_structs = new a_struct [10]}

但我不能做:

a_class() {my_structs = new a_struct(1) [10]}
//or
a_class() {my_structs = new a_struct() [10]}

有没有正确的语法可以让它工作?还是一个简单的解决方法?

4 个答案:

答案 0 :(得分:5)

如果使用STL是一个选项,您可以使用std :: vector而不是动态数组。

认为这会起作用:

std::vector<a_struct> my_structs;

my_structs.assign(10, 1);

如果没有,这应该:

my_structs.assign(10, a_struct(1));

答案 1 :(得分:3)

您可以分配原始内存块并使用展示位置新来初始化每个struct

int number_of_structs = 10;
my_structs = (a_struct*)new unsigned char[sizeof(a_struct) * number_of_structs];
     // allocate a raw chunk of memory 
a_struct* p = m_structs;
for (int i=0; i<number_of_structs; i++)
{
    new (p) a_struct(i);
    p++;
}

另请参阅:What uses are there for "placement new"?

答案 2 :(得分:0)

您可以使用指向指针的数组。然后你可以创建一个包含指向a_struct()的指针的数组,这样你就可以决定以后使用哪个构造函数:

class a_class {
    a_struct ** my_structs;

    a_class() { my_structs = new a_struct* [10]}
    void foo () {
       my_structs[0] = new a_struct(1);
       my_structs[5] = new a_struct("some string and float constructor", 3.14);
    }
}; 

答案 3 :(得分:0)

您不能直接在任何特定的参数化构造函数上执行此操作。但是你可以这样做,

a_struct *my_struct[10] = {}; // create an array of pointers

for (int i = 0; i < 10; i++)
    my_struct[i] = new a_struct(i); // allocate using non-default constructor

当您要取消分配内存时,

for (int i = 0; i < 10; i++)
    delete my_struct[i]  // de-allocate memory

我建议使用std::vector容器而不是完成此过程。