我对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的构造函数中声明的数组的大小。
如果你能帮助我理解为什么这项任务是非法的,或者为什么我会出现细分错误......非常感谢你的帮助。
答案 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
吗?如果没有,则x
和oArray
可能无法初始化。
我没有你的代码。但是当我修改你的代码段时,我发现没有分段错误,也没有编译器警告。
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;
}