分段错误(核心转储)C++ 初学者
Segmentation fault (Core Dumped) C++ Beginner
所以,我是 C++ 的新手。我研究了分段错误(核心转储)、内存分配和 new/delete,尽管我无法理解这些概念。我确实相信我的问题在于内存分配,这就是为什么我认为 "delete" 会解决我的问题。有人可以把我推向正确的方向吗?
输入
#include <iostream>
#include <string>
using namespace std;
struct CandyBar
{
string name;
double weight;
int calories;
} ;
int main()
{
CandyBar* backpack = new CandyBar[3];
backpack[0] = {"Choco Chalk", 5.1, 725};
backpack[1] = {"Twisty String", 1.8, 300};
backpack[2] = {"Gummy Nums", 4.4, 475};
cout << "Name\t\tWeight\tCalories" << endl << endl;
for (int x = 0; x < 4; x++)
{
cout << backpack[x].name << "\t" << backpack[x].weight << "\t" << backpack[x].calories << endl;
}
delete backpack;
return 0;
}
输出
Name Weight Calories
Choco Chalk 5.1 725
Twisty String 1.8 300
Gummy Nums 4.4 475
(Segmentation fault) core dumped
我看到两个错误:
您的循环 for (x = 0; x < 4; x++)
将遍历 x 值 0、1、2、3。但是,由于您将 backpack
分配给了 new Candybar[3]
,backpack
指向的内存只够容纳3CandyBar
s,即backpack[0], backpack[1], backpack[2]
。就目前而言,在第四次通过时,您的循环将尝试访问数组末尾的 backpack[3]
。
当你用new[]
分配内存时(就像你分配CandyBar
的数组一样),你必须用 delete[]
释放它,而不仅仅是简单的 delete
。见 delete vs delete[] operators in C++.
当我将你的循环退出条件更改为 x < 3
并将你的解除分配更改为 delete[] backpack;
时,程序对我有效。
所以,我是 C++ 的新手。我研究了分段错误(核心转储)、内存分配和 new/delete,尽管我无法理解这些概念。我确实相信我的问题在于内存分配,这就是为什么我认为 "delete" 会解决我的问题。有人可以把我推向正确的方向吗?
输入
#include <iostream>
#include <string>
using namespace std;
struct CandyBar
{
string name;
double weight;
int calories;
} ;
int main()
{
CandyBar* backpack = new CandyBar[3];
backpack[0] = {"Choco Chalk", 5.1, 725};
backpack[1] = {"Twisty String", 1.8, 300};
backpack[2] = {"Gummy Nums", 4.4, 475};
cout << "Name\t\tWeight\tCalories" << endl << endl;
for (int x = 0; x < 4; x++)
{
cout << backpack[x].name << "\t" << backpack[x].weight << "\t" << backpack[x].calories << endl;
}
delete backpack;
return 0;
}
输出
Name Weight Calories
Choco Chalk 5.1 725
Twisty String 1.8 300
Gummy Nums 4.4 475
(Segmentation fault) core dumped
我看到两个错误:
您的循环
for (x = 0; x < 4; x++)
将遍历 x 值 0、1、2、3。但是,由于您将backpack
分配给了new Candybar[3]
,backpack
指向的内存只够容纳3CandyBar
s,即backpack[0], backpack[1], backpack[2]
。就目前而言,在第四次通过时,您的循环将尝试访问数组末尾的backpack[3]
。当你用
new[]
分配内存时(就像你分配CandyBar
的数组一样),你必须用delete[]
释放它,而不仅仅是简单的delete
。见 delete vs delete[] operators in C++.
当我将你的循环退出条件更改为 x < 3
并将你的解除分配更改为 delete[] backpack;
时,程序对我有效。