Địa chỉ vùng nhớ

int tong(int a,int b)
{
   return a + b;
}

void main()
{
    int x,y;
    x=y=10;
    tong(x,y);
}

hàm main PC cấp mình 2 vùng nhớ x và y có kích thước kiểu int khi truyền đối số vào hàm tổng trong hàm tổng nó cấp mình thêm 2 vùng nhớ a và b nữa vậy cho mình hỏi sau khi ra khỏi hàm tổng thì 2 địa chỉ vùng nhớ a và b khi ra khỏi hàm có tự giải phóng hay ko nếu ko thì cho mình hỏi là
1.PC 1 khi đã cấp phát vùng nhớ thì vùng nhớ đó nó sẽ tồn tại(chiếm dụng) xuyên suốt chương trình có phải ko
2.nếu muốn PC thu hồi lại vùng nhớ đó thì phải dùng delete(c++) và free© có phải ko ?

a,b: đây là tham trị nên nó sẽ chết ngay sau khi ra khỏi {}.
x, y nó tạo ở trong main nên tương tự, đến cuối } sẽ bị thu hồi.

delete và free chỉ có tác dụng với con trỏ.
delete thì còn có chức năng là tự sát đối với các đối tượng mà bạn không muốn nó sống quá lâu, ví dụ:

class A
{
   public: A(){
    std::cout << "I will die" << std::endl;
    delete this;
  }
};
A tusat;

=> Thằng tusat sẽ chết (bị thu hồi) ngay sau khi khởi tạo.

1 Like

oke mình chỉ muốn biết vùng nhớ đó thế nào sau khi ra khỏi hàm thôi vậy chứ mấy giá trị nó lưu vào đâu nhỉ nếu pc thu hồi ?

Nó sẽ có thể còn sống, cũng có thể bị chương trình khác lấy đi, hoặc os thu hồi về RAM.

Nhưng dù sao nó cũng không còn là biến thuộc về chương trình đó nữa

1 Like

mình cứ nghĩ là con trỏ với biến thường cũng phải thu hồi lại vùng nhớ sau khi tạo ra chứ nhưng mà tóm lại sau khi ra khỏi hàm thì nó ko còn chiếm dụng vùng nhớ nữa phải ko ? tại lúc đọc về truyền tham biến với truyền giá trị vào nó ghi là tốn vùng nhớ vì nó tạo ra bản sao giá trị nên mình tưởng là nó tốn vùng nhớ

Biến chỉ tồn tại trong scope tạo ra nó:

{
	khai báo A;
	{
		khai báo B;
		khai báo C;
		{
			A, B, C có thể sử dụng được.
		}
		A, B, C có thể sử dụng được.
	}
	A có thể sử dụng được.
}
A, B, C đều "biến mất".

biến hay scope thì mình biết rồi đó cũng chỉ là cái tên định danh do user đặt chứ địa chỉ vùng nhớ mới là thứ mình quan tâm sau khi nó biến mất thì nó vẫn còn đó hay đc thu hồi lại thôi.
chẳng là học con trỏ sau khi cấp phát thì phải thu hồi vùng nhớ thì tự nhiên nghĩ đến mấy cái hàm lúc mình tạo 1 biến mới trong hàm thì tại sao lại ko phải thu hồi lại nhỉ nên mới lên đây hỏi thôi.

sau khi chương trình chạy kết thúc thì vùng nhớ đó chỉ có 1 trong 2 khả năng,

  • giá trị trong vùng nhớ vẫn đang tồn tại.Thời gian tồn tại ngắn thôi.
  • vùng nhớ đó được chương trình khác sử dụng.

Tại sao lại có việc cấp phát và thu hồi vùng nhớ:
Vì hồi xưa(1880 - 2000) vùng nhớ ít, nếu không có việc quản lý việc cấp phát vùng nhớ thì dẫn đến OS bị quá tải khi cấp phát vùng nhớ quá số lượng cho phép.

1 Like

Không hẳn, đến bây giờ và mai sau vẫn cần phải thu hồi, nhưng giờ là tự động thu hồi.

2 Likes

Bạn hiểu đơn giản thế này.

Biến là một cái tivi

Nó nằm trong nhà bạn (scope) -> Bạn xài thoải mái

Nhưng nếu bạn không xài nữa thì bạn vứt ra ngoài đường (ra khỏi scope), lúc này sẽ có 2 trường hợp xảy ra:

  • Thằng hàng xóm kế bên chôm tivi của bạn về và xài tiếp (ô nhớ sẽ được sử dụng bởi một chương trình khác)
  • Tivi vẫn nằm đó nhưng nó không còn là của bạn vì bạn đã vứt đi (nằm đó đợi thằng khác chôm về, nếu không thằng nào chôm về thì nó vẫn nằm đó tiếp) (ô nhớ vẫn còn đó, nhưng không còn thuộc về chương trình của bạn, đợi chương trình khác sử dụng ô nhớ)
1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?