2010-09-21 35 views

Trả lời

37

Đây được gọi là toán tử vị trí mới. Nó cho phép bạn cung cấp bộ nhớ dữ liệu sẽ được cấp phát mà không có toán tử new cấp phát bộ nhớ đó. Ví dụ:

Foo * f = new Foo(); 

Ở trên sẽ cấp phát bộ nhớ cho bạn.

void * fm = malloc(sizeof(Foo)); 
Foo *f = new (fm) Foo(); 

Ở trên sẽ sử dụng bộ nhớ được phân bổ bởi cuộc gọi đến malloc. new sẽ không phân bổ nữa. Tuy nhiên, bạn không bị giới hạn trong các lớp học. Bạn có thể sử dụng toán tử vị trí mới cho bất kỳ loại nào bạn sẽ phân bổ với một cuộc gọi đến new.

'' Gotcha '' cho vị trí mới là bạn không được giải phóng bộ nhớ được phân bổ bởi cuộc gọi đến toán tử mới vị trí bằng cách sử dụng từ khóa delete. Bạn sẽ phá hủy đối tượng bằng cách gọi trực tiếp destructor.

f->~Foo(); 
+2

Đúng. Xem thêm [câu trả lời này] (http: // stackoverflow.com/questions/2697892/what-is-return-type-of-new-in-c/2697929 # 2697929) cho sự khác biệt giữa biểu thức _new_ và phân bổ bộ nhớ thực. – sbi

+2

"' mới' sẽ không phân bổ nữa. " - Đối với đối tượng như một thứ có kích thước cố định - chắc chắn nhưng tất nhiên nó sẽ cấp phát bộ nhớ động nếu đối tượng yêu cầu nó - chuỗi, framebuffers, cơ sở dữ liệu, bất cứ thứ gì. –

2

Tôi đã sử dụng tính năng này nhưng nó cho phép bạn ghi đối tượng vào khối bộ nhớ mà bạn đã cấp phát. Nó cũng cần một tuyên bố xóa đối ứng để xóa nó khỏi bộ nhớ.

2

Nếu bạn sử dụng một nhóm bộ nhớ, thì bạn cần sử dụng hàm tạo tại chỗ để khởi tạo đối tượng của bạn khi chúng được cấp phát từ nhóm.

1

Đó là một cách để gọi một hàm tạo mà không cần cấp phát bộ nhớ. y của bạn phải là một con trỏ poniting đủ bộ nhớ cho một đối tượng Datatype mới. Ngoài ra, không gọi delete, gọi ~DataType().

7

Câu trả lời ngắn gọn là mã của bạn xây dựng một đối tượng trong không gian được trỏ đến bởi y. Câu trả lời dài nhất được bảo vệ bởi C++ FAQ.

4

này thường được gọi là 'vị trí mới' và được thảo luận khá tốt bởi C++ Hỏi đáp (trong khu vực 'Destructors'):

Nó cho phép bạn xây dựng các đối tượng trong bộ nhớ thô, có thể hữu ích trong các tình huống chuyên biệt nhất định, chẳng hạn như khi bạn có thể muốn phân bổ một mảng cho một số lượng lớn các đối tượng có thể, nhưng muốn xây dựng sau đó khi cần thiết vì bạn thường không cần bất cứ nơi nào n tai tối đa, hoặc bởi vì bạn muốn hoặc cần phải sử dụng một bộ cấp phát bộ nhớ tùy chỉnh.

Các vấn đề liên quan