2014-05-21 57 views
0

嘿,我是新來的C++面向對象編程(Java編碼),我有一些關於它的問題。C++面向對象的問題

我有兩個方法

void Manager::generate(){ 
    // Generate robot basis 
    Matrix4 robotBasis = generateRobotBasis(); 

    // Create Human 
    LinkedList * ll = new LinkedList(); 

    createLL(ll); 

    Node *j = ll->GetRoot(); 
    std::cout << j << "\n"; 
    j = j->pChild_; 
    std::cout << j << "\n"; 
    ... 
} 

void Manager::createLL(LinkedList * ll){ 
    Node node(); 
    ll->InsertRoot(&node); 
    Node node2(); 
    ll->InsertChild(&node, &node2); 
    Node node3(); 
    ll->InsertChild(&node2, &node3); 

    Node *j = &node; 
    std::cout << j << "\n"; 
    j = j->pChild_; 
    std::cout << j << "\n"; 
    j = ll->GetRoot(); 
    std::cout << j << "\n"; 
    j = j->pChild_; 
    std::cout << j << "\n"; 
} 

結果:

00ABF540 

00ABF498 

00ABF540 

00ABF498 

00ABF540 

00CB83A8 

最後一欄應該是00ABF498?但原來是一些隨機存儲器地址。

+8

這是一個函數聲明:'Node node();'。使用'Node節點;'。 – juanchopanza

+2

希望成爲一名Java程序員,你意識到在C++中這樣做不是必須的:'LinkedList * ll = new LinkedList();'。 Java不是C++,因爲如果處理不當,所有這些都會造成內存泄漏。你只需要這樣做:'LinkedList ll;'然後將地址傳遞給你正在調用的函數。 – PaulMcKenzie

+0

你能顯示LinkedList代碼嗎?你作爲Java程序員的陳述和事實是你插入一個本地棧變量作爲指針可能意味着你只是存儲一個指向它的地址的指針而不是複製它 – MatthiasB

回答

0

我們沒有LinkedList的插入方法的代碼,所以它只有大約問題

假設insertRoot和insertChild不分配一個節點對象,在代碼中的「節點」對象的源預感在Manager :: createLL的範圍結束時結束其生命(它們分配在堆棧上)。因此,只要將它們分配在: 你可以試試這個:

void Manager::createLL(LinkedList * ll){ 
Node* node = new node(); 
ll->InsertRoot(node); 
Node* node2 = new Node(); 
ll->InsertChild(node, node2); 
Node* node3 = new node(); 
ll->InsertChild(node2, node3); 

Node *j = node; 
std::cout << j << "\n"; 
j = j->pChild_; 
std::cout << j << "\n"; 
j = ll->GetRoot(); 
std::cout << j << "\n"; 
j = j->pChild_; 
std::cout << j << "\n"; 

}

的原因,你能看到根的地址,是不是因爲insertRoot工作。你剛剛複製了地址,但是當你離開「CreateLL」時,根節點也被釋放,地址引用了一些不相關的內存。另外,請注意釋放節點對象內存以避免內存泄漏(當前C++標準沒有內置垃圾回收)。

0

如果您刪除()以使代碼實際編譯,您將在列表中存儲陳舊指針(除非將節點複製到樹中而不是存儲指針)。

這些指向銷燬從createLL調用的局部變量。
取消引用其中的任何一個都是未定義的,如果嘗試,您很可能會得到垃圾值或崩潰。

如果您希望某個對象「超越」創建該對象的函數調用,則必須使用new

應該更多這樣的(未經測試):

void Manager::generate(){ 
    // Generate robot basis 
    Matrix4 robotBasis = generateRobotBasis(); 

    // Create Human 
    LinkedList ll; 

    createLL(ll); 

    Node *j = ll.GetRoot(); 
    std::cout << j << "\n"; 
    j = j->pChild_; 
    std::cout << j << "\n"; 
    ... 
} 

void Manager::createLL(LinkedList & ll){ 
    Node* node = new Node; 
    ll.InsertRoot(node); 
    Node* node2 = new Node; 
    ll.InsertChild(node, node2); 
    Node* node3 = new Node; 
    ll.InsertChild(node2, node3); 

    Node *j = node; 
    std::cout << j << "\n"; 
    j = j->pChild_; 
    std::cout << j << "\n"; 
    j = ll->GetRoot(); 
    std::cout << j << "\n"; 
    j = j->pChild_; 
    std::cout << j << "\n"; 
} 

Java和C++有很大的不同 - 你需要忘記很多的Java。