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ờ
Đó 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
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
@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ì đó) –