为构造函数中的结构数组分配存储C++

Allocate storage for array of structs in C++ constructor

本文关键字:分配 存储 C++ 数组 结构 构造函数      更新时间:2023-10-16

我正在尝试在构造函数中为结构数组动态分配存储。 我是C++新手,并且尝试了各种语法变体,但现在我想知道是否可以做到这一点。

struct Trade
{
    int index;
}
define MAX_TRADES 5000
struct foo
{
    Trade *trade [MAX_TRADES];
    int cumeTradeCount;
    foo() :
        cumeTradeCount(0),
    {
        // here is where I want to allocate storage for cumeTradeCount Trade structures
        ....
        memset(trade, 0, cumeTradeCount   * sizeof(Trade*));
    }
}

具体来说,我试图弄清楚的是如何在构造函数中为"cumeTradeCount"结构分配存储。如果我在 C 中执行此操作,我会执行以下操作:

for (int i = 0; i < cumeTradeCount; ++i)
    trade[i] = calloc(1, sizeof(Trade *));

你需要读一本好C++书。您的代码在堆栈上分配 5000 个指针。

要在堆栈上分配 5000 个Trade对象,只需使用 Trade trade[MAX_TRADES] ...例:

struct Trade
{
    int index;
};
#define MAX_TRADES 5000
struct foo
{
    Trade trade[MAX_TRADES];
    int cumeTradeCount;
    foo() : 
        cumeTradeCount(0)
    {
        // allocate storage for cumeTradeCount Trade structures
        //memset(trade, 0, cumeTradeCount   * sizeof(Trade*));
        // You don't need it
    }
};

至于堆,您可以使用运算符new在堆上进行分配。

更改此项:Trade *trade [MAX_TRADES]; Trade *trade = new Trade[MAX_TRADES];

由于它是类成员,下面是它是如何完成的。但是不要忘记在你的析构函数中delete它......下面是一个完整的示例...

struct Trade
{
    int index;
};
#define MAX_TRADES 5000
struct foo
{
    Trade *trade;
    int cumeTradeCount;
    foo() : trade(new Trade[MAX_TRADES]),
        cumeTradeCount(0)
    {
        // allocate storage for cumeTradeCount Trade structures
        //memset(trade, 0, cumeTradeCount   * sizeof(Trade*));
        // You don't need it
    }
    ~foo() { delete[] trade; }
};

.我强烈建议您使用std::arraystd::vector而不是原始数组。再一次,在C++中,我们更喜欢使用constconstexpr#defines ->仍然,你需要读一本好C++书。

下面,将为您省去许多不可预见的头痛。

#include <vector>
struct Trade
{
    int index;
};
#define MAX_TRADES 5000
struct foo
{
    std::vector<Trade> trade;
    int cumeTradeCount;
    foo() : trade(MAX_TRADES),
        cumeTradeCount(0)
    { }
};
Trade* trade [MAX_TRADES];

不是动态分配。它是一个固定大小的数组,包含 5000 个指向Trade的指针。

如果这是您想要的,您可以将它们全部设置为 NULL 或更好的nullptr然后像这样填充您需要的:

trade[i] = new Trade();

不要忘记在析构函数中使用delete并实现适当的赋值、复制构造函数和复制赋值。

如果你想要一个动态数组,请使用这样的东西:

Trade* trade[];
//in constructor
trade = new Trade*[sizeOfArray]; //remember those pointers are still uninitialized

或者,如果您不需要指针:

Trade trade[];
//in constructor
trade = new Trade[sizeOfArray];

既然你问的是C++,那就更容易用

  • std::array<Trade*,NUM_TRADES>(对于固定数量的指针),
  • std::array<Trade,NUM_TRADES>(固定的Trade秒数),
  • std::vector<Trade*>(对于可变数量的指针),
  • std::vector<Trade>(对于可变的Trade秒数),