2011-09-10 25 views
7

Tôi đã gỡ lỗi chương trình của mình và tôi đã nhận thấy rằng mặc dù tôi đã đánh dấu gần như tất cả nó là nhận xét và tất cả những gì tôi làm là đẩy các giá trị kép vào một vectơ , Tôi bị rò rỉ bộ nhớ. Tôi đọc api trong tài liệu tham khảo C++, nhưng không thể tìm thấy bất cứ điều gì. Dưới đây là các mã:rò rỉ bộ nhớ không rõ ràng với vector, C++, khi gọi exit

#include <vector> 
#include <cstdlib> 
#include <iostream> 
#include "RegMatrix.h" 
#include "Matrix.h" 

using namespace std; 

int main(void) 
{ 
    vector<double> v; 
    for (int i=0; i<9; i++) 
    { 
     v.push_back(i); 
    } 
    cout << endl; 

    exit(EXIT_SUCCESS); 
} 

Và báo cáo valgrind của:

==9299== HEAP SUMMARY: 
==9299==  in use at exit: 128 bytes in 1 blocks 
==9299== total heap usage: 5 allocs, 4 frees, 248 bytes allocated 
==9299== 
==9299== 128 bytes in 1 blocks are still reachable in loss record 1 of 1 
==9299== at 0x402569A: operator new(unsigned int) (vg_replace_malloc.c:255) 
==9299== by 0x804937D: __gnu_cxx::new_allocator<double>::allocate(unsigned int, void  const*) (in /home/yotamoo/workspace/ex3/main) 
==9299== by 0x804922F: std::_Vector_base<double, std::allocator<double>  >::_M_allocate(unsigned int) (in /home/yotamoo/workspace/ex3/main) 
==9299== by 0x8048E6C: std::vector<double, std::allocator<double>  >::_M_insert_aux(__gnu_cxx::__normal_iterator<double*, std::vector<double,  std::allocator<double> > >, double const&) (in /home/yotamoo/workspace/ex3/main) 
==9299== by 0x8048CA2: std::vector<double, std::allocator<double> >::push_back(double  const&) (in /home/yotamoo/workspace/ex3/main) 
==9299== by 0x8048B10: main (in /home/yotamoo/workspace/ex3/main) 
==9299== 
==9299== LEAK SUMMARY: 
==9299== definitely lost: 0 bytes in 0 blocks 
==9299== indirectly lost: 0 bytes in 0 blocks 
==9299==  possibly lost: 0 bytes in 0 blocks 
==9299== still reachable: 128 bytes in 1 blocks 
==9299==   suppressed: 0 bytes in 0 blocks 

Đây là kỳ lạ. Bất kỳ ý tưởng? nhờ

+2

Đó là do hàm exit() gây ra. Đó là mã C cũ và không thể xử lý các trình phá hủy C++ một cách chính xác. – tp1

+0

Có thể nào là v bị phá hủy sau khi thoát được gọi? Nếu bạn đặt v vào phạm vi riêng của nó (ví dụ với ngoặc vuông) thì sao? – nulvinge

+0

@yotamoo: Bạn thậm chí không thực sự phải làm điều đó. Khi kết thúc 'main' đạt đến nó giống như trả về số không từ chính. (Đó là hàm duy nhất được khai báo là trả về một 'int' không thực sự phải trả về một cái gì đó) –

Trả lời

18

exit() sẽ không gọi destructor của phạm vi hiện tại do đó có thể có một sự rò rỉ:

(§3.6.1/4) Gọi chức năng void exit(int); khai báo trong <cstdlib> (18.3) chấm dứt chương trình mà không cần để lại khối hiện tại và do đó không phá hủy bất kỳ đối tượng nào có thời gian lưu trữ tự động (12.4). Nếu thoát được gọi để kết thúc một chương trình trong khi hủy một đối tượng có thời gian lưu trữ tĩnh, chương trình có hành vi không xác định.

Sử dụng này để thay thế:

#include <vector> 
#include <iostream> 

int main(int argc, char *argv[]) { 
    std::vector<double> v; 

    for (int i=0; i<9; i++) { 
     v.push_back(i); 
    } 

    std::cout << endl; 
    return 0; 
} 
+4

Bạn đánh bại tôi và bạn đã xóa thùng rác 'using namespace'. 1 và nuked câu trả lời của riêng tôi. –

+1

@Billy Oneal: Và tôi đã sửa 'int main (void)';) – orlp

+1

@nightcracker: thực sự 'int main (void)' (hoặc, trong kiểu C++ tốt hơn, 'int main()') * là * hợp lệ ' chữ ký chính –

1

Bạn có thử đặt tất cả các mã trừ exit trong một {} khối riêng biệt?

2

Tôi không tin rằng bạn bị rò rỉ bộ nhớ. Khi valgrind nói rằng bộ nhớ vẫn có thể truy cập, nó không nói với bạn rằng nó bị rò rỉ nhưng nó không được tự do trước khi chương trình đã thoát. Trong trường hợp này, vector desctructor không được gọi trước khi thoát. Hãy thử trở về từ chính thay vì gọi exit().

7

Vectơ không bao giờ nằm ​​ngoài phạm vi để thoát.

Chỉ cần loại bỏ các exit() từ chính và thay thế bằng một return 0;

0

Bạn không cần phải gọi hàm exit nó sẽ thoát ngay lập tức từ chương trình đã không gọi cho hệ điều hành dọn dẹp các cuộc gọi.

Luôn sử dụng return() không thoát().