【问题标题】:Allocate storage for array of structs in C++ constructor [closed]在 C++ 构造函数中为结构数组分配存储[关闭]
【发布时间】:2016-02-29 01:00:12
【问题描述】:

我正在尝试在构造函数中为结构数组动态分配存储空间。我是 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 *));

【问题讨论】:

  • memset 确实分配内存 - 它设置为特定值。由于您正在初始化cumeTradeCount=0memset 实际上也不会做任何事情。另外,结尾的逗号会使这段代码无法编译。

标签: c++ arrays dynamic struct constructor


【解决方案1】:

You need to read a good C++ book.。您的代码在堆栈上分配了 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 --> 仍然,You need to read a good C++ book.

下面,将为您省去许多意想不到的麻烦。

#include <vector>
struct Trade
{
    int index;
};

#define MAX_TRADES 5000
struct foo
{
    std::vector<Trade> trade;
    int cumeTradeCount;

    foo() : trade(MAX_TRADES),
        cumeTradeCount(0)
    { }
};

【讨论】:

    【解决方案2】:
    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&lt;Trade*,NUM_TRADES&gt;(用于固定数量的指针),
    • std::array&lt;Trade,NUM_TRADES&gt;(对于固定数量的Trades),
    • std::vector&lt;Trade*&gt;(用于可变数量的指针),
    • std::vector&lt;Trade&gt;(对于Trades的可变数量),

    【讨论】:

      猜你喜欢
      • 2015-03-12
      • 2013-08-26
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-22
      • 2019-08-05
      • 1970-01-01
      相关资源
      最近更新 更多