指针分配和分段错误

Pointer assignment and segmentation fault

本文关键字:错误 分段 分配 指针      更新时间:2023-10-16

我对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?
}

我只想把数组的第cID个成员指向classb。

我的一个类似于上面的作业总是出现分段错误。我不知道为什么,我打印了cID,它肯定小于我们在ClassA的构造函数中声明的数组的大小。

为什么该分配是非法的,或者为什么我会出现分段错误?

正如我们在聊天中所意识到的,我只是将问题记录在这里以供参考。

问题出在上

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

RegisteredVM已分配并立即设置为NULL。该指针稍后在VMregister()函数中访问,该函数将导致seg。过错

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

我认为您应该将ClassA更改为

class ClassA{
  std::map<int, std::shared_ptr<ClassB> > mMap;
 public:
  ClassA();
};

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

我认为只要classb是指针,classb.getId()就应该是classb->getId()。这应该是编译器错误,我不认为这是出现分段错误的原因。

你确定你用那个特定的构造函数实例化了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;
}