Điều gì sẽ xảy ra với biến tĩnh khi được trả về làm tham chiếu và được truyền trực tiếp dưới dạng con trỏ tới hàm khác? Rõ ràng, biến vẫn tồn tại sau khi hàm trả về, nhưng một cái gì đó về toàn bộ khái niệm này chỉ làm phiền tôi. Tại thời điểm đó là bộ nhớ trên trình tự dữ liệu, bị chiếm bởi biến tĩnh, được giải phóng? Liệu thời gian chạy có được thông báo một cách kỳ diệu khi tôi không còn cần đến nó nữa, giống như một số loại thu gom rác thải không?Trả lại biến cục bộ tĩnh dưới dạng tham chiếu
Để đưa ra một ví dụ:
SDL_Rect* XSDL_RectConstr(int x, int y, int w, int h)
{
static SDL_Rect rect;
rect.x = x;
rect.y = y;
rect.w = w;
rect.h = h;
return ▭
}
void mainLoop()
{
while(isRunning)
{
pollEvents();
SDL_BlitSurface(someSurface, XSDL_RectConstr(0, 0, 100, 100), screen, NULL);
SDL_Flip(screen);
}
}
Điều gì xảy ra sau khi rect
SDL_BlitSurface() trả về? Tôi không thể thấy khi nào nó được giải phóng. Nó sẽ không phải là một loại rò rỉ bộ nhớ sau đó?
Vì vậy, nó sẽ vẫn hog lên một lượng lớn bộ nhớ, cho rằng nó đang chạy trong một vòng lặp vô hạn, phải không? Hay nó ghi đè lên chính nó mỗi khi XSDL_RectConstr() được gọi? Ngoài ra, SDL_rect là một cấu trúc, không phải là một lớp, và do đó không có một destructor, nhưng tôi đoán đó là không thích hợp. – CaffeineAddict
Nó ghi đè chính nó, đó là vấn đề. Mỗi cấu trúc (và mọi lớp) có một destructor, nếu bạn không viết một cái mặc định được tạo ra. – john
Nó không "ghi đè lên" bất cứ điều gì. Đó là cùng một đối tượng. Phép thuật duy nhất ở đây là nó không được xây dựng cho đến lần đầu tiên bạn nhập hàm đó; ngoài các quy tắc phạm vi thông thường, không có gì khác biệt về điều này hơn là một 'tĩnh' được định nghĩa trong phạm vi không gian tên. Nó giống như một "thành viên" tĩnh của hàm. –