2013-03-25 19 views
11

Tôi đã gỡ lỗi này trong 2 giờ rồi, và nó tóm lại điều này. Nếu tôi gọi QString::toStdStringQString :: toStdString() treo trên std :: string destructor

QString s = "testtesttesttesttesttest"; 
const std::string &temp = s.toStdString(); 

chương trình sau treo trên std :: string destructor

__CLR_OR_THIS_CALL ~basic_string() 
    { // destroy the string 
    _Tidy(true); // <---- It crashes on this line. 
    } 

Tôi nghĩ đó là tham nhũng bộ nhớ lúc đầu, nhưng điều này xảy ra ngay cả khi main() chỉ chứa những 2 dòng. Có ai biết tại sao điều này xảy ra không, và tôi có thể sửa nó như thế nào?

Phiên bản Qt của tôi là 4.8.1.

+0

Bạn đang sử dụng phiên bản Qt nào? Điều gì xảy ra nếu thay vì một tham chiếu bạn lưu trữ một bản sao của chuỗi 'string temp = s.toStdString();'? – RedX

+0

Điều tương tự xảy ra với 'string temp = s.toStdString();', nó chỉ xảy ra trước đó bởi vì hàm hủy của biến tạm thời được trả về bởi 'toStdString()' được gọi ngay lập tức. Làm cách nào để xem phiên bản Qt tôi đang sử dụng? Tôi nhìn ở đâu? Dự án đã được thiết lập bởi những người khác, tôi không có kinh nghiệm sử dụng Qt với Visual Studio, chỉ với Qt Creator. – sashoalm

+1

thử điều này: 'std :: string stdUtf8 = qs.toUtf8(). ConstData();' – Najzero

Trả lời

8

DLL Qt của bạn cần được biên dịch với hỗ trợ STL và chính xác cùng Thư viện C-Runtime làm mã của bạn. Dường như bạn đang sử dụng hai CRT khác nhau cùng một lúc, điều này sẽ hủy các đối tượng được tạo trên một đống bằng Qt vào heap mà chương trình của bạn sử dụng.

Kiểm tra việc sử dụng DLL với Walker phụ thuộc!

+0

Tôi đã mở cả hai .exe và QtCored4.dll nhưng tôi không chắc chắn nên tìm gì. Họ có rất nhiều phụ thuộc.Làm cách nào để biết liệu họ có đang sử dụng các CRT khác nhau không? Tên khác, hay cái gì khác? – sashoalm

+0

Chỉ cần đảm bảo bạn đã biên dịch Qt với cùng một trình biên dịch mà bạn đang sử dụng cho ứng dụng của mình. Ngoài ra hãy chắc chắn rằng bạn không trộn Debug và Release. – drescherjm

+0

Khởi động ứng dụng của bạn từ DependencyWalker ("Profiling") và xem, có bao nhiêu MS-CRT được tải. Nếu có nhiều hơn một, bạn có cơ hội tốt để gặp rắc rối. – Jens

0

Tôi đã cố giải quyết vấn đề theo một cách khác. Tôi tạo ra một dự án mới từ Visual Studio, và mã kiểm tra không sụp đổ ở đó. Khi kiểm tra sự khác biệt giữa các tệp * .vcproj với WinMerge, tôi thấy rằng sự cố là do một số thay đổi tùy chỉnh trong dự án liên quan - bạn đoán nó - các thư viện thời gian chạy. Đây là bản vá được tạo ra bởi WinMerge với sự khác biệt tối thiểu mà gây ra vụ tai nạn để được sao chép:

112c112 
<    RuntimeLibrary="3" 
--- 
>    RuntimeLibrary="1" 
126a127,128 
>    LinkLibraryDependencies="true" 
>    UseLibraryDependencyInputs="false" 
127a130,131 
>    IgnoreAllDefaultLibraries="false" 
>    IgnoreDefaultLibraryNames="msvcrtd.lib" 
0

lý do có thể xảy ra Hầu hết có thể là Thư viện Runtime của bạn là "Multi-ren (/ MT)" và bạn cần phải thay đổi nó vào "Đa luồng DLL (/ MD)" (nếu bạn đang sử dụng phiên bản phát hành)

Nếu bạn đang sử dụng phiên bản gỡ lỗi thay đổi từ "Gỡ lỗi nhiều luồng (/ MTd)" thành "Gỡ lỗi nhiều luồng DLL (/ MDd) "

Nếu bạn có một biên dịch lẻ của Qt, giải pháp phải ngược lại.

Bạn sẽ thấy rằng trên "Thuộc tính cấu hình-> C/C++ -> Mã thế hệ-> Thư viện thời gian chạy"