我在这里遇到了一些困难的情况,我希望有人能帮助我。
我有以下内容,
struct CandyBar{
std::string name;
double weight;
int calories;
} ;
现在,创建一个包含许多 CandyBar 的结构数组非常简单,我已经这样做了;
int main(){
CandyBar bars[] = {{"Mango tart", 2.3, 100}, {"Yo Yo", 3.2, 130}, {"Orange Ball", 1.7, 98}};
return 0;
}
但是,现在我想使用 new 创建相同的结构。当我想到它时它非常简单,但是它崩溃并且不起作用。
CandyBar *bars = new CandyBar;
(*bars).name = "Mango tart";
bars->weight = 2.3;
bars->calories = 100;
bars += 1;
(*bars).name = "Yo Yo";
bars->weight = 3.2;
bars->calories = 130;
bars += 1;
(*bars).name = "Orange Ball";
bars->weight = 1.7;
bars->calories = 98;
但是,这是行不通的。因为我认为第一个指针是指向第一个结构的内存位置,然后我创建结构,然后使用 bar += 1 增加地址,并继续创建指针,但我错过了一些非常严重的东西。
非常感谢您的帮助。
最佳答案
在您的第二个示例中,您只分配了一个 CandyBar
结构,但您将其视为一个数组。这不会有好结果,并且会导致缓冲区溢出。
为了分配一个 CandyBars
数组,您需要告诉 new 您想要一个数组,如下所示:
CandyBar* bars = new CandyBar[3];
确保在删除 CandyBars
数组时,您使用的是这样的数组删除:
delete[] bars;
综上所述,在 C++ 生产代码中,您通常会使用 std::vector 或 std::arrray 来处理这种情况,因为您不必像在这种特定情况下那样处理那么多的资源管理案例。
如果您必须在堆上动态分配一个数组并仍然使用 RAII,我还会查看 boost::shared_array
和 boost::scoped_array。
关于c++ - 使用 new 创建一个结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14114686/