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

问题描述:

我想在构造函数中为结构数组动态分配存储。我是C++新手,尝试过各种语法变体,但现在我想知道这是否可以完成。在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 *)); 
+0

'memset'并分配存储器 - 它设置为特定值。既然你正在初始化'cumeTradeCount = 0','memset'也不会做任何事情。另外,尾随的逗号会使这段代码不能编译。 – MuertoExcobito

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) 
    { } 
}; 

Trade* trade [MAX_TRADES]; 

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

如果这是你想要的,你可以将它们全部设置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),
+0

我错过了什么? – Anedar