Tôi có một chương trình, một phần để ghi nhật ký thông tin, tôi xuất tên của một số lớp khi chúng được sử dụng (cụ thể là tôi thêm một mục vào nhật ký nói dọc theo dòng Messages::CSomeClass transmitted to 127.0.0.1
). Tôi làm điều này với mã tương tự như sau:Rò rỉ bộ nhớ sau khi sử dụng typeinfo :: name()
std::string getMessageName(void) const {
return std::string(typeid(*this).name());
}
Và vâng, trước khi bất cứ ai chỉ nó ra, tôi nhận ra rằng đầu ra của typeinfo::name
là thực hiện cụ thể.
Theo MSDN
Các
type_info::name
chức năng thành viên trả về mộtconst char*
thành một chuỗi null-chấm dứt đại diện cho tên con người có thể đọc được các loại. Bộ nhớ được trỏ đến được lưu trong bộ nhớ cache và không bao giờ được trực tiếp deallocated.
Tuy nhiên, khi tôi thoát khỏi chương trình của mình trong trình gỡ lỗi, việc sử dụng "mới" typeinfo::name()
sẽ hiển thị dưới dạng rò rỉ bộ nhớ. Nếu tôi xuất thông tin cho 2 lớp, tôi nhận được 2 rò rỉ bộ nhớ, v.v. Điều này gợi ý rằng dữ liệu được lưu trữ không bao giờ được giải phóng.
Trong khi đây không phải là vấn đề lớn, có vẻ lộn xộn và sau một phiên gỡ lỗi dài, nó có thể dễ dàng ẩn các rò rỉ bộ nhớ chính hãng.
Tôi đã xem xét và tìm thấy một số thông tin hữu ích (một câu trả lời SO cung cấp một số thông tin thú vị về how typeinfo may be implemented), nhưng tôi tự hỏi nếu bộ nhớ này bình thường được giải phóng bởi hệ thống, hoặc nếu có điều gì đó tôi có thể làm "không thông báo" các rò rỉ khi gỡ lỗi.
Tôi có một kế hoạch sao lưu, để tự viết mã phương pháp getMessageName
và không dựa vào typeinfo::name
, nhưng tôi vẫn muốn biết nếu có điều gì đó tôi đã bỏ lỡ.
Có thể có liên quan? [http://connect.microsoft.com/VisualStudio/feedback/details/106937/memory-leaks-reported-by-debug-crt-inside-typeinfo-name](http://connect.microsoft.com/VisualStudio/ feedback/details/106937/bộ nhớ-rò rỉ-báo cáo-by-debug-crt-bên trong-typeinfo-tên). Bạn đang sử dụng trình biên dịch nào? Có thể thử một trình biên dịch khác nếu có thể? –
Vì nó được lưu trữ, đừng lo lắng về nó. – Jagannath
@jagansai: Tôi không lo lắng về sự rò rỉ của chính nó, vì nó chỉ ảnh hưởng đến đầu ra của trình gỡ lỗi khi thoát ứng dụng - mối quan tâm của tôi là nó có thể che giấu các rò rỉ bộ nhớ * thực *. Và có vẻ lộn xộn. Tôi làm như đầu ra trình gỡ rối gọn gàng :) – icabod