30/09/2018, 18:22
Vì sao khi return *this chương trình lại tự gọi destructor?
Đây là code: http://codepad.org/pgOIaMIL
#include <iostream>
using namespace std;
class ClassA
{
int *a;
public:
ClassA()
{
a = new int[1];
a[0] = 1;
}
ClassA abc()
{
return *this;
}
~ClassA()
{
if (a != NULL)
{
a = NULL;
delete [] a;
}
cout << "delete";
}
};
void main()
{
ClassA a;
a.abc();
cout << "123";
}
Kết quả xuất ra là:
delete123delete
Trong lý thuyết nói hàm destructor chỉ chạy 1 lần cho mỗi đối tượng khi không dùng nữa. Nhưng theo code này thì hàm destructor được gọi 2 lần. 1 lần là sau lệnh return *this, và 1 lần là trước khi kết thúc chương trình. Mình muốn hiểu rõ hơn về về vấn đề này.
Mong được giải đáp.
Bài liên quan
Đó là bởi vì khi bạn
return *this
từ hàmabc
tức là bạn tạo ra và trả về một thực thể(instance) của class đó. Và bởi vì bạn không gán giá trị trả về này cho biến nào nên nó bị hủy ngay luôn tại thời điểm đấy.Đây là code chứng minh ( Sửa lại code của bạn, bỏ đi cái không cần thiết )
Kết quả:
Trong đó địa chỉ của Object cha là
0x28fefe
, địa chỉ của object được tạo ra từ hàmabc
là0x28feff
Ta thấy object con bị hủy ngay lập tức
Còn object cha bị hủy khi kết thúc hàm main
Cảm ơn, em hiểu rồi.
Em có thử sửa lại hàm abc như sau:
như vậy thì khi return có phải sẽ không tạo ra obj mới nên sẽ không bị destructor. Và đây có phải cách tốt nhất không? Nếu không thì anh có thể cho em xin 1 vài gợi ý. Em cảm ơn.
Cái này khi gọi trong hàm main sẽ lấy con trỏ của biến a, nên cẩn thân khi gán sẽ gặp vấn đề self assignment
Vì bây giờ nó trả về con trỏ, trỏ tới thực thể ban đầu
Tùy vào nhu cầu sử dụng, nếu em muốn sử dụng một thực thể thì nên return con trỏ thôi. Thì đây là cách tốt nhất.
Em hiểu rồi. Cảm ơn mọi người nhiều.