thread thread 1 exc_bad_access (code=exc_i386_gpflt) 是什么,如何解决?C++

Whats the thread thread 1 exc_bad_access (code=exc_i386_gpflt) and how to solve it?C++

我正在使用 C++ 编写旅游指南,当我 运行 代码、Attraction class、setName 函数和 main 函数时,我不断收到此线程,我不明白这是什么问题。这是 .cpp 和主要文件。

//.cpp file
#include <string>
#include "Attraction.h"

    string Attraction::getName(){
        return name;
    }

    int Attraction::getIDType(){
        return id;
    }
    void Attraction::setName(string name){
        this -> name = name;//In this line I receive the thread
    }

    void Attraction::setIDType(int typeID){
        this -> typeID = typeID;
    }
//main.cpp
    int main() {
    int x;
    City Rome(111,"Rome");
    City Dubai(222,"Dubai");
    City Paris(333, "Paris");
    menu(Rome,Dubai,Paris);
    Sport* Ds = new Sport[x];
    Culture* Dc = new Culture[x];
    Shopping* Dh = new Shopping[x];
//{new Sport,new Sport,new Sport,new Culture,new Culture,new Culture,new Shopping,new Shopping,new Shopping};
    Ds[0].setName("Camel and Horse Racing");
    Ds[1].setName("Marine Sports");
    Ds[2].setName("Football");
    Dc[0].setName("Dubai Museum");
    Dc[1].setName("Falconry");
    Dc[2].setName("Sheikh Saeed Al-Maktoum's House");
    Dh[0].setName("Dubai Mall");//And here
    Dh[1].setName("Mall of Emirates");
    Dh[2].setName("Deira City Centre");
    Ds[0].setIDType(1);
    Ds[1].setIDType(1);
    Ds[2].setIDType(1);
    Ds[3].setIDType(2);
    Ds[4].setIDType(2);
    Ds[5].setIDType(2);
    Ds[6].setIDType(3);
    Ds[7].setIDType(3);
    Ds[8].setIDType(3);


    Dubai.setAttraction(Ds, x);

    return 0;
}

在您的 C++ 代码中,您正在创建一个大小为 x 的动态数组,但您从未为 x 赋值,这意味着它的默认值为 0。

这意味着以下行创建空数组:

Sport* Ds = new Sport[x];
Culture* Dc = new Culture[x];
Shopping* Dh = new Shopping[x];

因此,当您调用 Ds[0].setName() 时,您会遇到分段错误,因为您在错误的地址上调用方法。

为了解决这个问题,请确保为每个数组提供有效的大小。这是一个例子:

int main()
{

    Sport* Ds = new Sport[9];
    Ds[0].setIDType(1);
    Ds[0].setName("Camel and Horse Racing");
    Ds[1].setName("Marine Sports");
    Ds[2].setIDType(1);
    Ds[2].setName("Football");
    Ds[3].setIDType(2);
    Ds[4].setIDType(2);
    Ds[5].setIDType(2);
    Ds[6].setIDType(3);
    Ds[7].setIDType(3);
    Ds[8].setIDType(3);

    Culture* Dc = new Culture[3];
    Dc[0].setName("Dubai Museum");
    Dc[1].setName("Falconry");
    Dc[2].setName("Sheikh Saeed Al-Maktoum's House");

    Shopping* Dh = new Shopping[3];
    Dh[0].setName("Dubai Mall");//And here
    Dh[1].setName("Mall of Emirates");
    Dh[2].setName("Deira City Centre");

    delete[] Ds;
    delete[] Dc
    delete[] Dh;    

    return 0;
}