2012-05-30 16 views
5

trong tập tin xxxx.h:gcc/linux: CppuTest hiển thị rò rỉ bộ nhớ bằng cách sử dụng các vectơ tĩnh, sai số dương?

struct dn_instance_pair 
{ 
    std::string theDn; 
    int theInstance; 
}; 
typedef struct dn_instance_pair t_dn_inst_pair; 

struct table_rowid_type 
{ 
    char theTable[101]; 
    sqlite3_int64 theRowid; 
    int operation; 
}; 

// static class members 
static vector<t_dn_inst_pair> dninstList; 
static vector<t_table_rowid_type> tablerowidList; 

trong xxxx.cpp

// declaration of vectors. 
// Included to this post only for completeness. 
vector<t_dn_inst_pair> xxxx::dninstList; 
vector<t_table_rowid_type> xxxx::tablerowidList; 

Những vectơ được xử lý trong chức năng gọi lại tĩnh, vì vậy họ phải tĩnh quá.

Trong cpputest, khi cố gắng thêm một cái gì đó trong hoặc một trong các vectơ, một thất bại sẽ xảy ra:

Leak size: 8 Allocated at: <unknown> and line: 0. Type: "new" Content: "<\[email protected]" 

Các công cụ bổ sung vào một vector là các biến tự động và nó sẽ xảy ra trong một chức năng bình thường:

t_dn_inst_pair thePair; 
thePair.theDn = updated_dn; 
thePair.theInstance = updated_instance; 

các vector sẽ bị xóa vào cuối của trường hợp thử nghiệm:

xxxx::yyyy()->dninstList.clear(); 

(yy yy() trả về một con trỏ đến một đối tượng xxxx singleton)

Trang http://blog.objectmentor.com/articles/2010/02/04/cpputest-recent-experiences thảo luận cùng một loại bộ nhớ bị rò rỉ:

"Đây là một dương tính giả. Đây là một phân bổ một lần và một tác dụng phụ của C++ cấp phát bộ nhớ và khởi tạo tĩnh "

Vì vậy, câu hỏi của tôi là:.? là thất bại này thực sự là một sai tích cực

BR Esko

Trả lời

3

Bạn đã kiểm tra với valgrind? Nó sẽ phân biệt bộ nhớ bị rò rỉ "chắc chắn bị mất" trong bộ nhớ "vẫn có thể truy cập được" .Nếu nó là dương tính giả thì vẫn có thể truy cập được (thông qua con trỏ trong vectơ.)

Remembe r rằng vector::clear() chỉ phá hủy các phần tử, nó không giải quyết bất kỳ bộ nhớ nào, vì vậy capacity() sẽ vẫn giữ nguyên.

Bạn có thể làm các trick hoán đổi để buộc các vector để deallocate bộ nhớ của nó:

vector<t_dn_inst_pair>().swap(xxxx::yyyy()->dninstList); 

Điều đó tạo ra một tạm thời (trống) vector và giao dịch hoán đổi nó với vector của bạn, vì vậy các yếu tố của véc tơ và bộ nhớ phân bổ sẽ được chuyển giao cho tạm thời và sau đó bị phá hủy ở phần cuối của tuyên bố.

P.S. Singletons hút, không sử dụng chúng, nhưng tại sao bạn truy cập vào các vector như yyyy()->dninstList (tức là sử dụng operator->) nếu nó là một thành viên tĩnh? Bạn có thể nói xxxx::dninstList hoặc làm cho nó thành một thành viên không tĩnh và truy cập nó thông qua đối tượng đơn (nhưng đừng quên rằng người độc thân hút.)

+0

Xin chào Jonathan, Cảm ơn câu trả lời của bạn. Vâng, tôi đã kiểm tra với Valgrind; không có rò rỉ bộ nhớ. valgrind --tool = memcheck --leak-check = full --show-reachable = yes ./executable. Tôi sẽ thêm lừa trao đổi để deallocating. Và sẽ cố gắng để thay đổi các vector để không tĩnh và truy cập chúng thông qua singleton (mặc dù nó sucks;). br Esko –

+3

Tôi tin rằng nó thực sự xuất hiện vì trật tự hủy diệt. I E.rằng bộ nhớ thực sự được giải phóng, chỉ sau khi CppUTest đã báo cáo sự rò rỉ. Lý do là các đối tượng tĩnh chỉ bị phá hủy (và giải phóng bộ nhớ của chúng) trong quá trình hủy diệt toàn cục sau khi hàm 'main()' trả về, nhưng CppUTest có thể báo cáo rò rỉ ở phần cuối của trình điều khiển thử nghiệm, có nghĩa là vẫn còn trong 'main()' . Điều đó sẽ giải thích tại sao Valgrind không hiển thị chúng ngay cả với --show-reachable = yes. –

+0

Xin chào Jonathan, người không làm việc tĩnh như một sự quyến rũ. Tôi cũng đã trao đổi. Cảm ơn ! Cũng nhờ Jan cho lời giải thích –

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