2012-07-22 80 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