分段错误(核心转储)C++ 初学者

问题描述 投票:0回答:1

所以,我是 C++ 新手。我研究了分段错误(核心转储)、内存分配和新建/删除,尽管我很难理解这些概念。我确实相信我的问题在于内存分配,这就是为什么我认为“删除”可以解决我的问题。有人可以把我推向正确的方向吗?

输入

#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
c++11 segmentation-fault
1个回答
2
投票

我发现两个错误:

  • 你的循环

    for (x = 0; x < 4; x++)
    将迭代x值0,1,2,3。但是,由于你用
    backpack
    分配了
    new Candybar[3]
    backpack
    指向的内存仅足以容纳3个
    CandyBar
    ,即
    backpack[0], backpack[1], backpack[2]
    。按照目前的情况,在第四次循环时,您的循环将尝试访问
    backpack[3]
    ,它位于数组末尾。

  • 当您使用

    new[]
    分配内存时(就像您分配了 CandyBar
    array
    一样),您必须使用
    delete[]
    来取消分配它,而不仅仅是简单的
    delete
    。请参阅 C++ 中的 delete 与 delete[] 运算符

当我将循环退出条件更改为

x < 3
并将解除分配更改为
delete[] backpack;
时,该程序对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.