指针赋值和分段错误

时间:2012-07-22 16:24:56

标签: c++ class pointers g++

我对c ++相当新,并且我继续使用类似于以下代码的指针赋值进行分段错误,我知道这意味着我正在访问尚未分配的内存...但我看不到哪里:电子

我有两个班级:

class ClassA{ //class a decl.
  ClassB** oArray;
  unsigned int x;
 public:
  ClassA(unsigned int X);
  void oMember(ClassB* classb);
}


ClassA::ClassA(unsigned int X){ //Constructor for class a
  x = X;
  oArray = new ClassB* [x];

 for (unsigned int i = 0; i < x; i++){
        oArray = NULL; 
    }
}

class ClassB{ //rough decl of class B
  public:
   getId();
}

我有一个类成员函数,它接收一个指向另一个类的指针,如下所示:

void ClassA::oMember(ClassB* classb){
   unsigned int cID = classb.getId(); //defined in class b
   oArray[cID] = classb; //if cID is less than x defined in constructor, is this legal?
}

我只想将数组的cIDth成员指向classb。

我通过与上述类似的任务继续获得分段错误。我不太清楚为什么,我打印了cID,它肯定小于我们在ClassA的构造函数中声明的数组的大小。

如果你能帮助我理解为什么这项任务是非法的,或者为什么我会出现细分错误......非常感谢你的帮助。

3 个答案:

答案 0 :(得分:1)

我认为您应该将 ClassA 更改为

class ClassA{
  std::map<int, std::shared_ptr<ClassB> > mMap;

 public:
  ClassA();
};

现在,A类不需要知道数组大小,而mMap将确保您没有非常稀疏的数组。

答案 1 :(得分:1)

正如我们在chat中意识到的那样,我只是在这里记录问题以供参考。

问题在于

RegisteredVMs = new VendingMachine *[nVendingMachines];
for (unsigned int i = 0; i < nVendingMachines; i++){
   RegisteredVMs = NULL; 
}

已分配RegisteredVMs并立即设置为NULL。 稍后在VMregister()函数中访问此指针,这将导致seg。故障。

指针很难且很容易出错。只有在没有其他方法的情况下才使用它们。由于这是一个家庭作业问题,因为你说你对界面没有发言权,我看到你必须使用它们。

答案 2 :(得分:0)

我认为只要classb.getId()是指针,classb->getId()应为classb。那么,这应该是编译器错误,我不认为这是你得到分段错误的原因。

您确定使用该特定构造函数实例化ClassA吗?如果没有,则xoArray可能无法初始化。

我没有你的代码。但是当我修改你的代码段时,我发现没有分段错误,也没有编译器警告。

class ClassB {
public:
    int getId();
};

class ClassA {
    ClassB** oArray;
    unsigned int x;
public:
    ClassA(unsigned int X);
    void oMember(ClassB* classb);
};

int ClassB::getId() {
    return 0;
}

ClassA::ClassA(unsigned int X) {
    x = X;
    oArray = new ClassB* [x];
}

void ClassA::oMember(ClassB* classb) {
    unsigned int cID = classb->getId();
    oArray[cID] = classb;
}

int main(int argc, char** argv) {
    ClassA a(12);
    ClassB b;
    a.oMember(&b);
    return 0;
}