Tôi mới sử dụng con trỏ thông minh trên thế giới. Tôi đã đọc xong và tất cả đều nói rằng con trỏ thông minh sẽ tránh rò rỉ bộ nhớ ngay cả khi chương trình sẽ thoát sau khi gặp phải một ngoại lệ.rò rỉ C++ trong trường hợp ngoại lệ ngay cả khi sử dụng con trỏ thông minh
Tôi đã viết xuống một chương trình đơn giản để dùng thử, nhưng Valgrind cho tôi biết chương trình của tôi đang bị rò rỉ bộ nhớ (ba allocs và chỉ một phần mềm miễn phí).
Đây là mã nguồn:
#include <iostream>
#include <memory>
using namespace std;
int main()
{
auto_ptr<int> ptr_int(new int(5));
throw std::bad_alloc();
cout << *ptr_int;
}
Và báo cáo Valgrind này:
==27862== Memcheck, a memory error detector
==27862== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==27862== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==27862== Command: ./smart_pointers
==27862== Parent PID: 5388
==27862==
==27862==
==27862== HEAP SUMMARY:
==27862== in use at exit: 104 bytes in 2 blocks
==27862== total heap usage: 3 allocs, 1 frees, 120 bytes allocated
==27862==
==27862== 4 bytes in 1 blocks are still reachable in loss record 1 of 2
==27862== at 0x4026351: operator new(unsigned int) (vg_replace_malloc.c:255)
==27862== by 0x804878A: main (smart_pointers.cpp:8)
==27862==
==27862== 100 bytes in 1 blocks are possibly lost in loss record 2 of 2
==27862== at 0x4025BD3: malloc (vg_replace_malloc.c:236)
==27862== by 0x40E861A: __cxa_allocate_exception (in /usr/lib/libstdc++.so.6.0.14)
==27862== by 0x80487AE: main (smart_pointers.cpp:10)
==27862==
==27862== LEAK SUMMARY:
==27862== definitely lost: 0 bytes in 0 blocks
==27862== indirectly lost: 0 bytes in 0 blocks
==27862== possibly lost: 100 bytes in 1 blocks
==27862== still reachable: 4 bytes in 1 blocks
==27862== suppressed: 0 bytes in 0 blocks
==27862==
==27862== For counts of detected and suppressed errors, rerun with: -v
==27862== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 19 from 8)
Không sử dụng con trỏ thông minh đảm bảo các nguồn lực được phân bổ sẽ bị phá hủy ngay cả khi một ngoại lệ xuất hiện?
Bạn chưa bắt được ngoại lệ nào cả, Vì vậy, nó kết thúc lên gọi 'chấm dứt() 'mà hành vi mặc định là để gọi' hủy bỏ()'. Điều gì sẽ xảy ra nếu bạn bắt được ngoại lệ? –
Nếu bạn đang sử dụng một hệ điều hành hiện đại, hệ điều hành sẽ đòi lại bất kỳ bộ nhớ nào được chương trình sử dụng khi nó thoát ra, do đó bạn không nên lo lắng về việc rò rỉ bộ nhớ.Tất nhiên, đó là một tình huống khác nếu bạn đang sử dụng tài nguyên mà bạn cần dọn dẹp một cách rõ ràng. – TheJuice