在 C++ 构造函数中为结构数组分配存储[关闭]
Posted
技术标签:
【中文标题】在 C++ 构造函数中为结构数组分配存储[关闭]【英文标题】:Allocate storage for array of structs in C++ constructor [closed] 【发布时间】: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=0
,memset
实际上也不会做任何事情。另外,结尾的逗号会使这段代码无法编译。
【参考方案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::array
或std::vector
而不是原始数组。同样,在 C++ 中,我们更喜欢使用 const
和 constexpr
到 #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<Trade*,NUM_TRADES>
(用于固定数量的指针),
std::array<Trade,NUM_TRADES>
(对于固定数量的Trade
s),
std::vector<Trade*>
(用于可变数量的指针),
std::vector<Trade>
(对于Trade
s的可变数量),
【讨论】:
以上是关于在 C++ 构造函数中为结构数组分配存储[关闭]的主要内容,如果未能解决你的问题,请参考以下文章