2012-05-30 32 views
5

Thỉnh thoảng Tôi gặp lỗi "Lỗi xác nhận gỡ lỗi không thành công" đang chạy dự án Qt của tôi ở chế độ gỡ lỗi (image). Tôi không biết tôi đã sai ở đâu vì trình biên dịch không nói gì cả và tôi không biết phải làm gì để tìm lỗi của mình.Xác nhận gỡ lỗi Không thành công: _CrtIsValidHeapPointer (pUserData)

Chương trình của tôi trong Windows Vista, sử dụng Qt Creator 2.4.1, Qt 4.8.1.

chương trình của tôi có đọc một số thông tin từ một thiết bị laser và lưu chúng vào một tập tin với một mã tương tự như sau:

void runFunction() 
{ 
    configure_Scanning(...); 

    while(...) 
    { 
     // do something 
     scanFunction(); 
     // do something 
    } 
} 

và đây là của tôi "buộc tội" chức năng (nơi tôi nghĩ rằng vấn đề là)

void scanFunction() 
{ 
    file.open(); 

    data = getDataFromDevice(); 

    if(flag) 
    { 
     if(QString::compare(lineB,"")!=0) 
     { 
      QTextStream out(&file); 
      out << lineB << endl; 
      lineB = ""; 
     } 
     lineA.append(data+"\t"); 
    } 
    else 
    { 
     if(QString::compare(lineA,"")!=0) 
     { 
      QTextStream out(&file); 
      out << lineA << endl; 
      lineA = ""; 
     } 
     lineB.prepend(data+"\t"); 
    } 

    file.close(); 
} 

đâu LinealineB là bước đầu hai khoảng trống QString: ý tưởng là tôi thực hiện một chức năng quét hai chiều để lưu thông tin trong một ma trận 2D (fro m -X đến + X và ngược lại, trong khi Y đi đến một mục tiêu xác định). lineA ghi nhớ (-) đến (+) đọc; lineB ghi nhớ (+) để (-) đọc. Khi hướng quét thay đổi, tôi viết lineA (hoặc lineB) vào tệp và tôi tiến hành quét.

Bạn có hiểu những gì tôi đã nói không? Bạn có thể đề xuất cho tôi một giải pháp không?

Cảm ơn và xin lỗi vì tiếng Anh của tôi: P

+2

nhấp vào Thử lại trong hộp thoại để gỡ lỗi chương trình, giống như nó nói. Sau đó kiểm tra ngăn xếp cuộc gọi hoặc thêm nó vào câu hỏi này và bạn sẽ nhận được một ý tưởng tốt hơn về những gì sai. Trên một sidenote, liên tục mở và đóng một tập tin có lẽ là không cần thiết và gây ra một số chi phí. – stijn

+0

Tôi biết rằng việc mở và đóng tệp trên mỗi bước không phải là chiến lược tốt nhất, nhưng tôi phải làm điều đó để ngăn chặn mọi mất mát dữ liệu trong trường hợp gián đoạn bất ngờ. –

+0

không phải là những gì 'flush()' làm gì? – stijn

Trả lời

10

_CrtIsValidHeapPointerUserData nghĩa, rằng bạn có một tham nhũng đống, được chú ý bởi checker debug heap. Nghi ngờ mọi người có thể viết bất kỳ thông tin nào vào bất kỳ đối tượng động đã xóa nào. Và có, bạn sẽ nhận được sửa đổi đống không vô tình trên ghi đè xảy ra, nhưng trên kiểm tra heap tiếp theo, sẽ được thực hiện trên bất kỳ phân bổ bộ nhớ tiếp theo/deallocation. Tuy nhiên chỉ nên được theo dõi bởi một ngăn xếp cuộc gọi trong các ứng dụng đơn luồng.

+0

Tôi không nói rằng "My" Qt Creator không cho phép tôi chạy ứng dụng bằng trình gỡ lỗi. Vì vậy, tôi không thể kiểm tra bất kỳ lỗi nào khi chạy. Bạn có thể giải thích cho tôi làm thế nào để kiểm tra đống? –

+0

Không thể nói được.Brute force way là thay thế TẤT CẢ các con trỏ với các lớp con trỏ thông minh và đặt chúng để kích hoạt các thông báo lỗi khi phát hiện vấn đề. – Forgottn

+0

Ý tưởng hay! Nhưng ... Tôi không biết khi nào vấn đề được phát hiện. Dù sao, tôi sẽ cố gắng theo cách này. Cảm ơn ý tưởng! –

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