Bạn có nghĩa là như phải tự giải phóng bộ nhớ, đóng tệp, những thứ thuộc loại này? Nếu vậy, tôi sẽ nói mức tối thiểu và thường ít hơn hầu hết các ngôn ngữ khác mà tôi đã sử dụng, đặc biệt là nếu chúng tôi khái quát hóa không chỉ là "quản lý bộ nhớ" mà còn "quản lý tài nguyên". Theo nghĩa đó, tôi thực sự nghĩ rằng C ++ yêu cầu quản lý tài nguyên thủ công ít hơn so với Java hoặc C #.
Điều này chủ yếu là do các công cụ phá hủy tự động phá hủy tài nguyên (bộ nhớ hoặc cách khác). Thông thường, lần duy nhất tôi phải giải phóng / hủy tài nguyên theo cách thủ công trong C ++ là nếu tôi đang triển khai cấu trúc dữ liệu ở mức độ thấp (điều mà hầu hết mọi người không cần phải làm) hoặc sử dụng API C khi tôi chỉ mất một ít thời gian gói tài nguyên C cần được giải phóng / hủy / đóng thủ công vào trình bao bọc C ++ tuân thủ RAII.
Tất nhiên, nếu người dùng yêu cầu đóng hình ảnh trong phần mềm chỉnh sửa ảnh, tôi phải xóa hình ảnh khỏi bộ sưu tập hoặc thứ gì đó. Nhưng hy vọng rằng điều đó không được tính là quản lý "bộ nhớ" hoặc "tài nguyên" thuộc loại quan trọng trong bối cảnh này, vì điều đó được yêu cầu khá nhiều trong bất kỳ ngôn ngữ nào nếu bạn muốn giải phóng bộ nhớ liên quan đến hình ảnh đó vào thời điểm đó. Nhưng một lần nữa, tất cả những gì bạn phải làm là xóa hình ảnh khỏi bộ sưu tập và bộ hủy hình ảnh sẽ đảm nhiệm phần còn lại.
Trong khi đó, nếu tôi so sánh với Java hoặc C #, bạn thường thấy mọi người phải đóng các tệp theo cách thủ công ở đó, ngắt kết nối ổ cắm theo cách thủ công, đặt tham chiếu đối tượng thành null để cho phép chúng được thu gom rác, v.v. Có nhiều bộ nhớ thủ công hơn và quản lý tài nguyên trong các ngôn ngữ đó nếu bạn hỏi tôi. Trong C ++, bạn thường không cần phải sử dụng unlock
mutex một cách thủ công, vì trình khóa mutex sẽ tự động làm điều đó khi mutex vượt quá phạm vi. Ví dụ, bạn không bao giờ phải làm những việc như thế này trong C ++:
System.IO.StreamReader file = new System.IO.StreamReader(path);
try
{
file.ReadBlock(buffer, index, buffer.Length);
}
catch (System.IO.IOException e)
{
...
}
finally
{
if (file != null)
file.Close();
}
Không cần phải làm những việc như đóng tệp thủ công trong C ++. Cuối cùng, họ tự động đóng cửa ngay lập tức khi họ đi ra khỏi phạm vi cho dù họ đi ra khỏi phạm vi như là kết quả hoặc đường dẫn thực thi thông thường hoặc đặc biệt. Điều tương tự cho các tài nguyên liên quan đến bộ nhớ như std::vector
. Mã như file.Close()
trên thường sẽ được tán thành vì, đặc biệt là trong bối cảnh của một finally
khối, điều đó cho thấy tài nguyên cục bộ cần được giải phóng bằng tay khi toàn bộ suy nghĩ xung quanh C ++ là tự động hóa điều đó.
Về mặt quản lý bộ nhớ thủ công, tôi muốn nói C yêu cầu tối đa, Java / C # một lượng trung bình và C ++ tối thiểu trong số này. Có nhiều lý do để hơi ngại sử dụng C ++ vì đây là ngôn ngữ rất khó để thành thạo, nhưng quản lý bộ nhớ không nên là một trong số đó. Ngược lại, tôi thực sự nghĩ rằng đó là một trong những ngôn ngữ dễ nhất ngoài kia về khía cạnh này.
Tất nhiên C ++ không cho phép bạn bắt đầu phân bổ bộ nhớ theo cách thủ công và gọi operator delete/delete[]
bộ nhớ trống thủ công. Nó cũng cho phép bạn sử dụng các hàm C như malloc
vàfree
. Nhưng đó là cách thực hành mã hóa theo kiểu cổ xưa mà tôi nghĩ đã trở nên lỗi thời từ lâu trước khi mọi người tín dụng, vì Stroustrup đã ủng hộ RAII trước khi anh ta đặt ra thuật ngữ từ rất sớm. Vì vậy, tôi thậm chí không nghĩ rằng thật công bằng khi nói "C ++ hiện đại" tự động hóa việc quản lý tài nguyên, bởi vì đó được cho là mục đích xuyên suốt. Bạn thực tế không thể có được sự an toàn ngoại lệ. Chỉ là rất nhiều nhà phát triển sai lầm trong những năm đầu thập niên 90 đã cố gắng sử dụng C ++ giống như C với các đối tượng, thường hoàn toàn bỏ qua việc xử lý ngoại lệ và không bao giờ được sử dụng theo cách đó. Nếu bạn sử dụng C ++ theo cách thực tế luôn được sử dụng, thì việc quản lý bộ nhớ hoàn toàn tự động và nói chung không phải là thứ bạn phải tự xử lý (hoặc nên xử lý) nhiều.