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
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 –
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. –
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 –