Trả về kiểu value như sau thì quá cơ bản và không có vấn đề với scope:
int return_Value()
{
int value = 500;
return value;
}
Trả về kiểu reference:
int& return_Reference()
{
int value = 10;
return value;
}
Như mình biết thì không nên trả về reference như trên vì biến value là local, khi hàm thực thi xong sẽ tự động được giải phóng. Nhưng khi mình thử dòng code dưới đây trong main() thì nó vẫn ra giá trị đúng.
int data = return_Reference(); // data sẽ có giá trị là 10.
Suy nghĩ của mình: mặc dù biến value được giải phóng sau khi hàm return_Reference() thực thi xong nhưng giá trị mà nó lưu trữ trên stack vẫn nằm ở đó. Chỉ khi nào có người khác dùng vùng nhớ đó thì nó mới thay đổi. Vì vậy, khi mình gán cho biến data ở trên thì nó vẫn trả ra giá trị là 10.
Nếu không trả về kiểu tham trị nhưng vẫn muốn gán giá trị của return_Referance() cho một biến nào đó thì mình có thể đổi lại như sau:
void return_Reference(int& output)
{
int value = 10;
output = value;
}
Trả về kiểu pointer:
Trường hợp 1: memory allocated on Heap
user_define* return_Heap_Pointer()
{
user_define* pointer = new user_define();
return pointer;
}
Theo mình hiểu thì nó chỉ trả về cái địa chỉ trỏ đến object của user_define vừa được tạo ra. user_define nằm trong heap nên muốn giải phóng phải dùng delete. Khi return_Heap_Pointer() thực thi xong thì biến pointer vẫn bị giải phóng vì nó là biến local. Nhưng như mình vừa nói ở trên, nó trả về cái địa chỉ mà nó trỏ đến nên khi mình gán như dưới đây thì không vấn đề gì, việc nó bị hủy chẳng ảnh hưởng gì ở đây.
user_define* p = return_Heap_Pointer();
Trường hợp 2: memory allocated on Stack
int* return_Stack_Pointer()
{
int age = 10;
int* p = &age;
return p;
}
Nếu mình dùng hàm return_Stack_Pointer() như sau:
int* data = return_Stack_Pointer();
thì kết quả nhận được khi dereference data là 10.
Cho mình hỏi khi một local variable được allocate trên stack mà lose scope thì nó như thế nào? Dựa vào mấy cái code trên thì mình nghĩ là khi lose scope, các variable này bị xóa nhưng giá trị mà nó được gán cho vẫn nằm trong stack, tại cái địa chỉ mà các variable này được tạo ra. Các vùng nhớ này nếu không được người khác sử dụng thì giá trị của các variale trên vẫn nằm ở đây. Không biết mình hiểu đúng không?
Vậy khi nào mới nên trả về kiểu reference? Câu trả lời của mình: chỉ dùng khi trả về cái gì đó nằm trên heap. Ví dụ: khi overload assignment operator.
Trả về kiểu pointer => tương tự referece.
Những cái sau đây mình hiểu có đúng không?
int main()
{
char name[50]; // local variable, nằm trên stack
WaterWater myCup; //WaterWater là user define type, local variable, nằm trên heap mặc dù new không đươc gọi.
WaterWater *myGlass = new WaterWater(); // myGlass là local variable, vùng nhớ mà myGlass trỏ tới được allocate trên heap và cần gọi delete sau khi dùng xong.
}