Có nên sử dụng các hàm C API để phân bổ đầu ra của chúng hay để người dùng chỉ định bộ đệm đầu ra? Ví dụ:Thiết kế API - phân bổ đầu ra?
BOOL GetString(
PWSTR *String
);
...
PWSTR string;
GetString(&string);
Free(string);
vs
BOOL GetString(
PWSTR Buffer,
ULONG BufferSize,
PULONG RequiredBufferSize
);
...
// A lot more code than in the first case
Cụ thể hơn, tôi tự hỏi tại sao các API Win32 chủ yếu sử dụng trường hợp thứ hai (ví dụ GetWindowText, LookupAccountSid). Nếu một hàm API biết đầu ra lớn như thế nào, tại sao người dùng cố gắng đoán kích thước đầu ra? Tôi không thể tìm thấy bất kỳ thông tin nào về lý do trường hợp thứ hai sẽ được sử dụng.
Ngoài ra: ví dụ LookupAccountSid đặc biệt xấu. Bên trong nó sử dụng API LSA, phân bổ đầu ra cho người gọi. Sau đó, LookupAccountSid được người dùng phân bổ một bộ đệm (và đoán kích thước bộ đệm chính xác) khi nó chỉ có thể trả về kết quả từ LSA! Tại sao?
Điều đó tùy thuộc. Cả hai thành ngữ đều được sử dụng. Cả hai đều có điểm cộng và nhược điểm. –
Ưu điểm của trường hợp thứ hai sau đó, ngoài việc có thể sử dụng bộ đệm dựa trên stack? – wj32
Nó cho phép người gọi sử dụng sự lựa chọn của họ về phân bổ. Nếu bạn cấp phát bộ nhớ và để nó cho người gọi miễn phí, người gọi cần sử dụng deallocater tương ứng - có thể không phải là sở thích của họ. Việc lấp đầy bộ đệm do người gọi cung cấp cho phép họ chọn một người phân bổ thích hợp cho mục đích của họ, thay vì dựa vào API mà họ đã chọn. –