2013-04-24 38 views
14

Tôi mới dùng mac và nhạc cụ, tôi sử dụng nó để kiểm tra ứng dụng Qt của mình, tôi thấy rất nhiều đối tượng bị rò rỉ, hầu như tất cả đều đến từ Qt lib.I. mã rất cẩn thận nhưng không thể tìm thấy vấn đề. Để tránh vấn đề rò rỉ bộ nhớ, tôi tuân thủ nghiêm ngặt các quy tắc của RAII, luôn để lớp xử lý các tài nguyên, đảm bảo mọi widget đều có cha, những widget không có cha mẹ (có ý định) sẽ bảo vệ bằng con trỏ thông minh hoặc Qt :: WA_DeleteOnClose.Cụ giữ cho tôi bị rò rỉ bộ nhớ

Để khắc phục cảnh báo rò rỉ bộ nhớ, tôi viết một ứng dụng Qt rất đơn giản và sử dụng nó như một thử nghiệm, các công cụ luôn hiển thị rằng tôi có một số rò rỉ bộ nhớ (làm biểu đồ) ngay cả đơn giản nhất Ứng dụng Qt tôi đã tạo.

#include <QApplication> 
    #include <QLabel> 

     int main(int argc, char *argv[]) 
    { 
     QApplication a(argc, argv); 


     QLabel w; 
     w.resize(320, 240); 
     w.show(); 

     return a.exec(); 
    } 

Đồ thị của các công cụ

Call tree

Leaked object

tôi thay đổi mã một chút, và xem bộ nhớ bị rò rỉ cho thấy bởi Instruments sẽ tiếp tục tăng hay không.

#include <QApplication> 
    #include <QLabel> 

     int main(int argc, char *argv[]) 
     { 
     QApplication a(argc, argv); 


     for(size_t i = 0; i != 100; ++i){ 
     QLabel w; 
     w.resize(320, 240); 
     w.show(); 
     } 
     QLabel w; 
     w.resize(320, 240); 
     w.show(); 

     return a.exec(); 
    } 

Call tree Leaked object

Bộ nhớ bị rò rỉ làm tăng, tôi rất hy vọng rằng đây là một sai lầm của các nhạc cụ, khác tôi phải thả trở lại Qt4 (và tôi không biết nó sẽ có cùng một vấn đề hay không) .I đừng nghĩ rằng ứng dụng đơn giản này có thể vượt qua kiểm tra chất lượng của cửa hàng ứng dụng mac (OSX). Điều gì đang xảy ra? Làm thế nào tôi nên giải thích hiện tượng này? Nếu không có rò rỉ bộ nhớ, tôi nên không thấy bất kỳ thông điệp nào của đối tượng bị rò rỉ, tôi có đúng không? Lỗi của Qt5.0.2?

+1

Nếu bạn chỉ rời khỏi chương trình của mình trong một thời gian rất dài, bộ nhớ làm việc có tăng đều không? Tôi sẽ không vội vàng để giả định có điều gì đó sai trái với máy dò rò rỉ, nhưng đây không phải là lần đầu tiên tôi nhìn thấy một người đưa ra những mặt tích cực sai. –

+0

Tôi chỉnh sửa câu trả lời của mình, thử lại mới và rò rỉ bộ nhớ được hiển thị bằng các công cụ tăng, tin xấu – StereoMatching

+0

Ý tôi là "bộ nhớ làm việc có tăng đều không?" "Nếu bạn xem cửa sổ Trình quản lý tác vụ Windows (hoặc tương đương với Mac), cột bộ làm việc có tăng đều không?" –

Trả lời

1

Bộ nhớ thực sự bị rò rỉ, một khuôn khổ đáng tin cậy không bao giờ nên làm.

Về cơ bản, khuôn khổ nên sử dụng con trỏ thông minh, hoặc vi phạm rò rỉ bộ nhớ nên được truy tìm và xử lý bằng "thủ công".

Nếu không có rò rỉ thì tất cả bộ nhớ sẽ được trả về heap sau khi sử dụng.

Theo bugreports.qt-project.org/browse/QTBUG-7505 lỗi này nằm trong phiên bản 4.6.0.