是什么线程线程1 exc_bad_access(代码= exc_i386_gpflt)以及如何解决它?C ++

时间:2015-12-20 11:16:18

标签: c++ xcode6

我正在使用c ++编写导游,我在运行代码时,在Attraction类,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;
}

1 个答案:

答案 0 :(得分:1)

在您的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;
}