2012-07-22 79 views
0

我对C++相当陌生,而且我一直使用类似于以下代码的指针分配来获得分段错误,我知道这意味着我正在访问尚未分配的内存......但是我看不出其中:e指针分配和分段错误

我有两个类:

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

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

我不断收到与上述类似的分配的分段错误。我不知道为什么,我打印了cID,它肯定小于我们在ClassA构造函数中声明的数组的大小。

如果你能帮助我理解为什么这项任务是非法的或为什么即时通讯分段故障...你的援助是非常感谢。

+1

你应该遵循的东西,因为你的课是分配内存:[规则三](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-reeree)。在另一个说明中,'ClassB * classb){... classb.getId();'不应该编译。 – chris 2012-07-22 16:27:00

+0

如果您发布的代码可以帮助我们重现问题(代码听不会编译),那么您会更容易。否则,代码有太多错误,我们不可能真正帮助你。 – pmr 2012-07-22 16:29:59

+0

@pmr,好吧我会发布代码 – anpatel 2012-07-22 16:32:15

回答

1

正如我们在chat中所实现的那样,我只是将问题记录在这里以供参考。

问题在于这块

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

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

指针很难且很容易出错。只有在没有其他方式时才使用它们。由于这是一个家庭作业问题,既然你说你在界面上没有发言权,我发现你必须使用它们。

1

我想你应该改变你的ClassA的

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

public: 
    ClassA(); 
}; 

现在的A类并不需要知道数组的大小和MMAP将确保你不会有很稀疏数组。

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; 
} 
+0

糟糕。问题描述发生了重大变化。我会在这里留下这个答案。 – 2012-07-22 16:47:19

+0

非常感谢。是的,我有一个更简单的版本,但实际的代码被要求,所以我改变了它。你所概述的确能帮助我。我会看看我的主要功能,看看我是否正确调用了这些功能。 – anpatel 2012-07-22 16:52:04

+0

你的代码确实工作..也许它的另一个类导致了这个问题。我仍然遇到seg故障。 – anpatel 2012-07-22 17:01:12