2011-10-16 74 views
6

Tôi đang gặp vấn đề với con trỏ của mình trong C++ và sẽ rất tuyệt nếu ai đó có thể chia sẻ kiến ​​thức chuyên môn của họ với tôi!Hành vi con trỏ không mong đợi trong C++

Kết quả tôi nhận được là:

1: 
2: 
END: C 
1:C 
2:E 
END: E 

Kết quả tôi đã mong đợi là:

1: 
2: 
END: C 
1:C 
2:C 
END: E 

Mã liên quan là thế này:

test.cpp tôi

tree.insert('C'); 
tree.insert('E'); 

Inse rt chức năng:

template <typename T> pair<typename btree<T>::iterator, bool> btree<T>::insert(const T& elem) { 
    cout << "1:" << this->rbegin_->value() << endl; 
    btree_node<T> node(elem); 
    cout << "2:" << this->rbegin_->value() << endl; 
    rbegin_ = &node; 
    iterator itr; 
    pair<typename btree<T>::iterator, bool> p(itr, false); 
    cout << "END: " << this->rbegin_->value() << endl; 
    return p; 
} 

Các nhà xây dựng cho btree_node (mà về cơ bản là trống):

template <typename T> btree_node<T>::btree_node(const T& elem) : value_(elem), nextCont_(NULL), prevCont_(NULL), nextNode_(NULL), prevNode_(NULL) {} 

Lớp btree có một biến tin:

btree_node<T>* rbegin_; 

Đó là những gì tôi đang thay đổi . rbegin_ ban đầu được thiết lập để một nút trống trong constructor btree với:

btree_node<T> end(NULL); 
rbegin_ = &end; 

Nó có vẻ như constructor nút của tôi, mà không làm gì, được sửa đổi giá trị của rbegin-> giá trị() ....

Bất kỳ trợ giúp nào được đánh giá cao.

+0

Hy vọng Bạn đang theo quy tắc Ba. –

+0

Hi Als, xin lỗi vì sự thiếu hiểu biết của tôi, nhưng "quy tắc Ba" là gì? Trân trọng. Tôi chắc chắn sẽ cố gắng làm theo nó, nếu nó thực sự là một cái gì đó hợp lý để làm theo :) – Mick

+1

kiểm tra này ra [what-is-the-rule-of-ba] (http://stackoverflow.com/questions/4172722/what- is-the-rule-of-three) –

Trả lời

6

Bạn đã nhận nó bởi may mắn:

1: 
2: 
END: C 
1:C  <--- Undefined. 
2:E 
END: E 

Sai lầm là ở đây:

template <typename T> pair<typename btree<T>::iterator, bool> btree<T>::insert(const T& elem) { 
    cout << "1:" << this->rbegin_->value() << endl; 
    btree_node<T> node(elem); /* LOCAL parameter, will be deleted when leaving scope*/ 
    cout << "2:" << this->rbegin_->value() << endl; 
    rbegin_ = &node; /* Pointing to a LOCAL parameter, when leaving the scope it will point to undefined memory. */ 
    iterator itr; 
    pair<typename btree<T>::iterator, bool> p(itr, false); 
    cout << "END: " << this->rbegin_->value() << endl; 
    return p; 
} 

Vì vậy:
A. Phân bổ bộ nhớ của "nút" tự động (malloc hoặc lâu hơn).
B. Tôi không biết những gì bạn đang cố gắng làm, nhưng bạn làm cho mỗi chèn để thay thế cây đầu với giá trị mới và bỏ qua cái đầu cũ (miễn phí?) ... Tôi không nghĩ rằng đó là muốn bạn muốn làm.

+1

Cảm ơn Roee, mã chức năng chèn đó không thực sự làm bất cứ điều gì vào lúc này .. Ban đầu tôi đã viết thêm mã, nhưng khi tôi nhận thấy lỗi này, tôi đã quay lại và tước đi mọi thứ để gỡ lỗi. Cảm ơn - tôi sẽ cố gắng tự động phân bổ nút, và hy vọng rằng các công trình! Trân trọng! – Mick

+0

Cảm ơn rất nhiều! Tôi đã dành một 3 giờ tốt tự hỏi về điều này (trong khi xem xét có thể một số phần khác của mã của tôi đã gây ra vấn đề). Hoạt động hoàn hảo ngay bây giờ. – Mick

Các vấn đề liên quan