2013-02-19 16 views
7

Tôi đang gặp vấn đề rò rỉ bộ nhớ trong mã, trong khi nó đang chạy, heap cứ tăng lên đến mức tối đa và tôi cần khởi động lại dịch vụ, tôi chạy lệnh trên cùng và thấy rằng heap đang tăng lên bất cứ khi nào im gọi một kịch bản trong dịch vụ.valgrind Điều kiện nhảy hoặc di chuyển phụ thuộc vào giá trị uninitialised (s), điều này cho thấy rò rỉ bộ nhớ?

Tôi chạy dịch vụ với valgrind,

valgrind --log-file=log-feb19.txt --leak-check=full --show-reachable=yes --track-origins=yes myservice 

tôi donot thấy bất kỳ khối chắc chắn bị mất hoặc có thể bị mất trong khi iam chạy các kịch bản nhưng tôi thấy rất nhiều nhảy có điều kiện hoặc di chuyển phụ thuộc vào giá trị uninitialised (s) lỗi.

Làm việc này có bị rò rỉ bộ nhớ không?

Ví dụ về những gì tôi đang nhận được:

==27278== Conditional jump or move depends on uninitialised value(s) 

==27278== at 0xC90D91E: xcsFreeMemFn (in /apps/opt/mqm/lib64/libmqmcs_r.so) 

........

==27278== Uninitialised value was created by a heap allocation 

==27278== at 0x4A078B8: malloc (vg_replace_malloc.c:270) 

==27278== by 0xC90E32F: xcsGetMemFn (in /apps/opt/mqm/lib64/libmqmcs_r.so) 

một người nào đó có thể giúp.

+0

bạn đã tìm thấy câu trả lời đúng chưa? nếu có, hãy đánh dấu một cái là chính xác. – logoff

+0

có thể trùng lặp của [xác định "nhảy điều kiện hoặc di chuyển phụ thuộc vào giá trị uninitialized (s)" valgrind tin nhắn] (http://stackoverflow.com/questions/2612447/pinpointing-conditional-jump-or-move-depends-on-uninitialized -values-valgrin) –

Trả lời

15

Không, nó có nghĩa là bạn đang truy cập bộ nhớ mà không được khởi tạo:

int main() 
{ 
    int unitialized; 
    std::cout << unitialized << std::endl; 
} 

sẽ làm xuất hiện lỗi này.

Hơi phổ biến hơn sẽ là:

struct X 
{ 
    X() : i(42) { } 
    private: 
    int i; 
    int* forgotten; // oops, not initialized 
}; 

Cuối cùng, điều này thường xuyên xảy ra với mã dựa malloc, khi bạn không sử dụng memset để xóa toàn bộ đệm. Vì vậy,

  1. malloc một kích thước bộ đệm m
  2. đọc (ví dụ như từ một ổ cắm) n byte
  3. ghi m byte vào một tập tin; (m-n) byte sẽ không được khởi tạo
+0

Tôi đồng ý điều này không chỉ ra một rò rỉ bộ nhớ nhưng vì nó gọi hành vi không xác định nó có thể dẫn đến bất cứ điều gì –

1

Không điều này không cho biết rò rỉ bộ nhớ trực tiếp. Tuy nhiên có một bước nhảy có điều kiện tùy thuộc vào một biến không khởi tạo có thể dẫn đến thực tế bất cứ điều gì. Sử dụng các biến uninitialized nói chung gọi hành vi không xác định.

+2

Trong C, sử dụng một đối tượng uninitialized không phải là hành vi undefined cho mỗi se. Nó chỉ là UB nếu đối tượng "có thể đã được khai báo với' register' "đó là nếu địa chỉ của nó không bao giờ được lấy. Đọc bộ nhớ uninitialized thông qua một con trỏ là hoàn toàn tốt (từ đó POV). Đó là sự phân nhánh trên những giá trị như vậy mà valgrind đúng phàn nàn về. –

4

Nó được giải thích trong Valgrind Hướng dẫn sử dụng, trong phần 4.2.2. Use of uninitialised values:

lỗi sử dụng uninitialised-giá trị được báo cáo khi chương trình của bạn sử dụng một giá trị chưa được khởi tạo - nói cách khác, là chưa xác định.

...

Điều quan trọng là phải hiểu rằng chương trình của bạn có thể sao chép xung quanh rác (uninitialised) dữ liệu nhiều như nó thích. Memcheck quan sát điều này và theo dõi dữ liệu, nhưng không phàn nàn. Khiếu nại là chỉ được phát hành khi chương trình của bạn cố gắng sử dụng dữ liệu chưa được khai báo theo cách có thể ảnh hưởng đến hành vi của bạn bên ngoài hiển thị của chương trình.

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