Hỏi về C++ memory leak - vozForums
vozForums
Go Back   vozForums > Học tập và công việc > Ngành CNTT > Phát triển Phần mềm
Reply
 
Thread Tools
  #1  
Old 20-05-2018, 02:48
giwim 5's Avatar
giwim 5 giwim 5 is offline
Đã tốn tiền
 
Join Date: 01-2014
Posts: 542
Hỏi về C++ memory leak

Code:
 int main()
 {
	 double *sales = nullptr,
		 total = 0.0,
		 average;
	 int numDays, repeat;
	 do
	 {
		 cout << "How many days ?" << endl;
		 cin >> numDays;
		 sales = new double[numDays];
		 cout << "Enter the sales." << endl;
		 for (int count = 0; count < numDays; count++)
		 {
			 cout << "Day" << (count + 1) << ": ";
			 cin >> sales[count];
		 }
		 for (int count = 0; count < numDays; count++)
		 {
			 total += sales[count];
		 }
		 average = total / numDays;
		 cout << setprecision(2) << fixed << showpoint;
		 cout << "Total sales: $" << total << endl;
		 cout << "Average sales: $" << average << endl;
		 cin >> repeat;
		 // delete[] sales;
		 // sales = nullptr;
	 } while (repeat != 2);
	 return 0;
 }
cái dòng delete rồi set nullptr là để tránh memory leak, cơ mà e xóa đi với ko xóa chả thấy khác biệt gì cả Vậy memory leak là gì ạ
Reply With Quote
  #2  
Old 20-05-2018, 03:14
quannv1.fpt quannv1.fpt is offline
K.I.A
 
Join Date: 07-2012
Posts: 77
Re: Hỏi về C++ memory leak

1. set null chả có tác dụng gì trong việc chống memory leak hết.
2. với mấy bài toán nhỏ nhỏ thì quản lý bộ nhớ chỉ mang yếu tố làm màu vì khi thoát process thì hđh nó cũng tự deallocate hết, nhưng đối với những ct dùng nhiều ram hoặc long running process mà để memory leak là biết mặt nhau ngay. 1065473
Reply With Quote
  #3  
Old 20-05-2018, 09:55
FinalDevil's Avatar
FinalDevil FinalDevil is offline
Senior Member
 
Join Date: 02-2014
Posts: 213
Re: Hỏi về C++ memory leak

Check memleak với Valgrind:

Code:
09:49 AM:~/Desktop$ valgrind --leak-check=yes ./x 
==5666== 
==5666== HEAP SUMMARY:
==5666==     in use at exit: 72,720 bytes in 2 blocks
==5666==   total heap usage: 6 allocs, 4 frees, 74,882 bytes allocated
==5666== 
==5666== 16 bytes in 1 blocks are definitely lost in loss record 1 of 2
==5666==    at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5666==    by 0x400C4B: main (x.cpp:16)
==5666== 
==5666== LEAK SUMMARY:
==5666==    definitely lost: 16 bytes in 1 blocks
==5666==    indirectly lost: 0 bytes in 0 blocks
==5666==      possibly lost: 0 bytes in 0 blocks
==5666==    still reachable: 72,704 bytes in 1 blocks
==5666==         suppressed: 0 bytes in 0 blocks
==5666== Reachable blocks (those to which a pointer was found) are not shown.
==5666== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==5666== 
==5666== For counts of detected and suppressed errors, rerun with: -v
==5666== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
Reply With Quote
  #4  
Old 20-05-2018, 10:22
giwim 5's Avatar
giwim 5 giwim 5 is offline
Đã tốn tiền
 
Join Date: 01-2014
Posts: 542
Re: Hỏi về C++ memory leak

Quote:
Originally Posted by quannv1.fpt View Post
1. set null chả có tác dụng gì trong việc chống memory leak hết.
2. với mấy bài toán nhỏ nhỏ thì quản lý bộ nhớ chỉ mang yếu tố làm màu vì khi thoát process thì hđh nó cũng tự deallocate hết, nhưng đối với những ct dùng nhiều ram hoặc long running process mà để memory leak là biết mặt nhau ngay. 1065473
e điền theo sách thôi thím, tại nó bảo set về null phòng về sau này có xài tiếp cái new array đó thì đỡ bị chồng dữ liệu

Quote:
Originally Posted by FinalDevil View Post
Check memleak với Valgrind:

Code:
09:49 AM:~/Desktop$ valgrind --leak-check=yes ./x 
==5666== 
==5666== HEAP SUMMARY:
==5666==     in use at exit: 72,720 bytes in 2 blocks
==5666==   total heap usage: 6 allocs, 4 frees, 74,882 bytes allocated
==5666== 
==5666== 16 bytes in 1 blocks are definitely lost in loss record 1 of 2
==5666==    at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5666==    by 0x400C4B: main (x.cpp:16)
==5666== 
==5666== LEAK SUMMARY:
==5666==    definitely lost: 16 bytes in 1 blocks
==5666==    indirectly lost: 0 bytes in 0 blocks
==5666==      possibly lost: 0 bytes in 0 blocks
==5666==    still reachable: 72,704 bytes in 1 blocks
==5666==         suppressed: 0 bytes in 0 blocks
==5666== Reachable blocks (those to which a pointer was found) are not shown.
==5666== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==5666== 
==5666== For counts of detected and suppressed errors, rerun with: -v
==5666== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
thanks bác, e tải cái soft đó về xài đây
Reply With Quote
Đang tải...
  #5  
Old 20-05-2018, 16:50
Berberin Berberin is offline
Senior Member
 
Join Date: 07-2008
Posts: 752
Re: Hỏi về C++ memory leak

Quote:
Originally Posted by quannv1.fpt View Post
2. với mấy bài toán nhỏ nhỏ thì quản lý bộ nhớ chỉ mang yếu tố làm màu vì khi thoát process thì hđh nó cũng tự deallocate hết, nhưng đối với những ct dùng nhiều ram hoặc long running process mà để memory leak là biết mặt nhau ngay. 1065473
Tớ hỏi chút, khi kill 1 process thì mình có chắc chắn OS sẽ giải phóng toàn bộ heap cấp phát cho process ấy ko? Windows? Linux?

Sent from my fingers using vozFApp
Reply With Quote
  #6  
Old 22-05-2018, 22:41
bribnt's Avatar
bribnt bribnt is online now
Đã tốn tiền
 
Join Date: 02-2013
Posts: 3,767
Re: Hỏi về C++ memory leak

Quote:
Originally Posted by Berberin View Post
Tớ hỏi chút, khi kill 1 process thì mình có chắc chắn OS sẽ giải phóng toàn bộ heap cấp phát cho process ấy ko? Windows? Linux?

Sent from my fingers using vozFApp
Có.
Nhưng vấn đề là giải phóng bộ nhớ nhưng không gọi destructor. Có nghĩa là những thứ đáng ra phải làm trong destructor (đóng file, đóng kết nối, ...) sẽ không được thực hiện.
Reply With Quote
  #7  
Old 23-05-2018, 12:15
Berberin Berberin is offline
Senior Member
 
Join Date: 07-2008
Posts: 752
Re: Hỏi về C++ memory leak

Tất nhiên rồi, thank bác.

Sent from my fingers using vozFApp
Reply With Quote
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

All times are GMT +7. The time now is 12:25.
Chịu trách nhiệm nội dung: Bạch Thành Trung © 2019 Công ty TNHH Thật Vi Diệu
ĐC tầng 4, số 6-8 Đường D2, Bình Thạnh, Hồ Chí Minh, Việt Nam - SĐT 0981323799 - MST 0313906593
Giấy phép thiết lập MXH số 334/GP-BTTTT, Ký ngày: 19/08/2019