Tất cả những điều sau đây là trình biên dịch ngây thơ sẽ làm gì. Tất nhiên miễn là nó không thay đổi hành vi của chương trình, trình biên dịch là miễn phí để thực hiện bất kỳ tối ưu hóa.
string a;
a = "hello!";
Trước tiên, bạn khởi tạo để chứa chuỗi rỗng. (đặt độ dài thành 0 và một hoặc hai thao tác khác). Sau đó, bạn chỉ định giá trị mới, ghi đè giá trị độ dài đã được đặt. Nó cũng có thể phải thực hiện một kiểm tra để xem bộ đệm hiện tại lớn đến mức nào và có nên cấp phát bộ nhớ nhiều hơn hay không.
string *a;
a = new string("hello!");
...
delete(a);
Gọi mới yêu cầu hệ điều hành và bộ nhớ cấp phát để tìm một đoạn bộ nhớ miễn phí. Đó là chậm. Sau đó, bạn khởi tạo nó ngay lập tức, vì vậy bạn không gán bất cứ điều gì hai lần hoặc yêu cầu bộ đệm được thay đổi kích cỡ, giống như bạn làm trong phiên bản đầu tiên. Sau đó, điều gì đó xấu xảy ra và bạn quên gọi xóa, và bạn bị rò rỉ bộ nhớ, thêm ngoài vào chuỗi cực kỳ chậm để phân bổ. Vì vậy, điều này là xấu.
string a;
a = "less";
a = "moreeeeeee";
Giống như trong trường hợp đầu tiên, trước tiên bạn khởi tạo để chứa chuỗi rỗng. Sau đó, bạn gán một chuỗi mới và một chuỗi khác. Mỗi một trong số này có thể yêu cầu cuộc gọi mới để cấp phát thêm bộ nhớ. Mỗi dòng cũng yêu cầu độ dài và có thể phải gán các biến nội bộ khác.
Thông thường, bạn muốn phân bổ nó như thế này:
string a = "hello";
Một dòng, thực hiện khởi tạo một lần, chứ không phải là mặc định-khởi tạo, và sau đó gán giá trị mà bạn muốn đầu tiên.
Nó cũng giảm thiểu lỗi, vì bạn không có chuỗi trống vô nghĩa ở bất kỳ đâu trong chương trình của bạn. Nếu chuỗi tồn tại, nó chứa giá trị bạn muốn.
Giới thiệu về quản lý bộ nhớ, google RAII. Trong ngắn hạn, chuỗi cuộc gọi mới/xóa nội bộ để thay đổi kích thước bộ đệm của nó. Điều đó có nghĩa là bạn không bao giờ cần phải phân bổ chuỗi mới. Đối tượng chuỗi có kích thước cố định và được thiết kế để được cấp phát trên ngăn xếp, sao cho hàm hủy là tự động được gọi khi nó nằm ngoài phạm vi. Các destructor sau đó đảm bảo rằng bất kỳ bộ nhớ được phân bổ được giải phóng. Bằng cách đó, bạn không phải sử dụng mới/xóa trong mã người dùng của bạn, có nghĩa là bạn sẽ không bị rò rỉ bộ nhớ.
Bạn có đang sử dụng một lớp chuỗi cụ thể hay chỉ các chuỗi ký tự không được chấm dứt tiêu chuẩn không? – tsellon
Tôi sẽ giả định câu hỏi là về std :: string. – rmeador