2010-10-01 77 views
5

Tôi đôi khi (ngẫu nhiên) nhận được khởi tạo không chính xác các giá trị, khiến tôi nghĩ rằng tôi đang sử dụng bộ nhớ chưa được khởi tạo ở đâu đó. Cấu trúc dữ liệu chính của tôi là:C++ Bộ nhớ chưa được khởi tạo?

template <class state> 
class learnedStateData { 
public: 
    learnedStateData() :gCost(DBL_MAX), hCost(0), isDead(false) {} 
    state theState; 
    double gCost; 
    double hCost; 
    bool isDead; 
}; 

Điều này đang được lưu trữ trong một hash_map STL. Bất kỳ suy nghĩ về cách tôi có thể nhận được dữ liệu uninitialized (bên cạnh theState) từ cấu trúc dữ liệu này?

Hãy để tôi làm rõ: Tôi không muốn giá trị của mình không được khởi tạo, nhưng đôi khi chúng dường như ngẫu nhiên.

+2

Ngoài theState bạn đã khởi tạo đúng mọi thành viên trong lớp của mình. Do đó không khởi tạo theState có thể là nguồn gốc của vấn đề. –

+1

Nếu 'state' có một hàm tạo mặc định, nó sẽ tự động được gọi, do đó không cần phải gọi nó một cách rõ ràng. Tuy nhiên, nếu không có constructor mặc định, đó là một câu chuyện khác. –

+1

* cách tôi có thể nhận dữ liệu chưa được khởi tạo (bên cạnh theState) * ... Bằng cách này, ** dữ liệu ** bạn muốn nói là chưa được khởi tạo? Bên cạnh 'theState', các dữ liệu khác được hiển thị trong' lớp' dường như được khởi tạo đúng cách ... – liaK

Trả lời

4

Việc triển khai hoàn toàn đúng ... vấn đề của bạn phải ở nơi khác. Bạn có thể sử dụng một công cụ như valgrind để kiểm tra truy cập bộ nhớ không hợp lệ, uninitialised lần đọc vv .. Bạn có thể thêm một số xác nhận để cố gắng thu hẹp điểm mà trạng thái bị hỏng. Nếu bạn cung cấp thuật toán băm, hãy đảm bảo nó trả về cùng một giá trị cho cùng một giá trị khóa. Kiểm tra bạn bằng cách nào đó không sửa đổi khóa của một đối tượng trong khi nó nằm trong vùng chứa. Bạn có thể hoán đổi trong một std :: map <> và xem vấn đề có biến mất hay không.

+0

Nó kết thúc việc thực hiện là âm thanh, như bạn nói. Vấn đề là tôi đã có một tham chiếu đến một thể hiện trong hash_map đã được đặt lại ngẫu nhiên khi hash_map thay đổi kích cỡ. –

+1

Vui mừng khi biết bạn đã tìm thấy lỗi. Chúc mừng. –

3

Bạn chưa khởi theState bên trong constructor

Sử dụng Value Initialization

template <class state> 
class learnedStateData { 
public: 
    learnedStateData() :theState(),gCost(DBL_MAX), hCost(), isDead() {} 
    state theState;  ^      ^  ^
    double gCost;   |_________________________|__________| 
    double hCost;       | 
    bool isDead;      Value Initialized 
}; 
+4

Làm thế nào là có liên quan? Câu hỏi đi ra khỏi con đường của mình để nói theState không phải là vấn đề, và giá trị initialisation là không đáng tin cậy hơn so với các giá trị rõ ràng được cung cấp trong câu hỏi. –

+0

@Tony: Việc khởi tạo giá trị không đáng tin cậy như thế nào? Làm thế nào một người nào đó có thể tự động quyết định chính xác vấn đề là gì chỉ bằng cách nhìn vào mã được cung cấp? Bạn có thể? Vấn đề duy nhất tôi có thể thấy là 'theState' không được khởi tạo. Hơn nữa làm thế nào ông có thể nói một cách tự tin rằng đối tượng/biến không được khởi tạo không gây ra bất kỳ vấn đề gì? –

+3

@Prasoon: Tôi không nói rằng việc khởi tạo giá trị không đáng tin cậy, tôi hỏi tại sao bạn nghĩ nó sẽ trở nên đáng tin cậy hơn. Ý kiến ​​của tôi là các thành viên dữ liệu đang được khởi tạo chính xác, và cung cấp một cách khác để làm điều tương tự sẽ không giúp ích gì. Vấn đề là ở nơi khác trong đời đối tượng. Anh ta có thể tự tin theState không liên quan vì một hoặc nhiều trường khác đang bị hỏng và theState không liên quan đến việc xử lý của họ. –

4

Có thể rằng bạn đã có một iterator không hợp lệ hoặc con trỏ đến một learnedStateData<T> nơi nào đó?

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