Tôi đã đi sâu hơn vào C++ gần đây và các lỗi của tôi dường như trở nên phức tạp.C++: Dữ liệu đọc có thể ảnh hưởng đến bộ nhớ như thế nào?
Tôi có vectơ các đối tượng, mỗi đối tượng chứa một vectơ nổi. Tôi quyết định tôi cần tạo một mảng phẳng hơn chứa tất cả các giá trị float của tất cả các đối tượng trong một. Nó phức tạp hơn một chút nhưng ý chính của vấn đề là khi tôi lặp qua các đối tượng của tôi giải nén các giá trị float, tại một thời điểm nào đó, vật thể của tôi bị thay đổi, hoặc bị hỏng theo một cách kỳ lạ nào đó. (Các hoạt động đọc của tôi là tất cả các hàm const)
Một ví dụ khác là với MPI. Tôi chỉ mới bắt đầu vì vậy tôi chỉ muốn chạy chính xác cùng một mã trên hai nút khác nhau với bộ nhớ riêng của họ và không có truyền dữ liệu xảy ra, tất cả rất đơn giản. Trước sự ngạc nhiên của tôi, tôi có lỗi phân đoạn và sau khi theo dõi giờ, tôi thấy rằng một nhiệm vụ của một biến đã đặt một biến hoàn toàn khác thành NULL.
Vì vậy, tôi tò mò, làm thế nào có thể là hoạt động đọc có thể ảnh hưởng đến cấu trúc dữ liệu của tôi. Tương tự như thế nào một hoạt động dường như không liên quan ảnh hưởng đến một hoạt động khác. Tôi không thể mong đợi các giải pháp cho vấn đề của tôi với những mô tả ngắn gọn nhưng lời khuyên nào sẽ được đánh giá cao.
Cập nhật: Đây là một đoạn mã, tôi không đăng bài ban đầu vì tôi không chắc chắn bao nhiêu có thể được trích xuất từ nó mà không hiểu toàn bộ hệ thống.
Một điều tôi chỉ phát hiện ra mặc dù là khi tôi ngừng gán giá trị cho mảng phẳng của tôi và chỉ cout'ed thay vào đó, các lỗi seg biến mất. Vì vậy, có lẽ tôi tuyên bố mảng của tôi sai, nhưng ngay cả khi tôi là tôi không chắc chắn làm thế nào nó sẽ ảnh hưởng đến vector đối tượng.
void xlMasterSlaveGpuEA::FillFlatGenes() {
int stringLength = pop->GetGenome(0).GetLength();
for (int i=0;i<pop->GetPopSize();i++)
for (int j=0;j<stringLength;j++)
flatGenes[(i*stringLength)+j]<< pop->GetGenome(i).GetFloatGene(j);
}
float xlVectorGenome::GetFloatGene(unsigned int i) const {
return GetGene(i);
}
mảng căn hộ của tôi là một hàm thành viên
float * flatFitness;
initailsed trong constructor như vậy:
flatFitness = new float(popSize);
Cập nhật 2:
Tôi chỉ muốn chỉ ra rằng hai ví dụ trên không liên quan, ví dụ đầu tiên không phải là đa luồng. Ví dụ MPI thứ hai là về mặt kỹ thuật, nhưng Bộ KH & ĐT được phân phối bộ nhớ và tôi cố tình thực hiện triển khai đơn giản nhất mà tôi có thể nghĩ đến, đó là cả hai máy chạy mã độc lập. tuy nhiên có một chi tiết thêm, tôi đặt trong một condtional nói
if node 1 then do bottom half of loop
if node 1 then do top half
Một lần nữa, bộ nhớ cần được cô lập, họ nên làm việc như thể họ không biết gì về nhau .. nhưng loại bỏ điều kiện này và làm cho cả hai vòng làm tất cả các hình khối, loại bỏ lỗi
Bạn có thể đăng phiên bản mã bị cô đặc không? Rất khó để nói từ điều này những gì có thể xảy ra. – tgamblin
Bạn có thể đăng mã vòng lặp nơi bạn lặp lại các đối tượng trong vectơ ... có thể bạn đang bước vào bộ nhớ ở đó? – Balk
Thao tác đọc không thay đổi giá trị. Phải có cái gì đó khác trong mã của bạn. Ví dụ thứ hai của bạn là một tình huống điển hình của một biến trỏ đến địa điểm sai. – fbinder