Đây là vị trí mới.
Mặc dù bạn không thường sử dụng nó với các loại số nguyên.
Nó thường được sử dụng để xây dựng một bộ đệm nơi bạn sau đó xây dựng các loại khác vào.
// Allocate a buffer with enough room for two T objects.
char* buffer = new char[sizeof(T) * 2];
// Allocate a T in slot zero
T* t1 = new (buffer + 0 * sizeof(T)) T("Zero");
// Allocate a T in slot one
T* t2 = new (buffer + 1 * sizeof(T)) T("One");
Thats cơ bản.
Nhưng hãy nhớ rằng các đối tượng được phân bổ với vị trí mới không thể bị xóa với câu lệnh delete
. Điều này là do delete
cố gắng đòi lại bộ nhớ được phân bổ bởi new
(cũng như gọi hàm hủy). Vì vậy, để sử dụng các đối tượng này một cách chính xác, bạn phải tự gọi đó là destructor.
t1->~T();
t2->~T();
Đừng quên xóa bộ đệm gốc.
delete [] buffer;
Một vài hãy cẩn thận khác:
Mọi người thường thấy đệm có thể được thực hiện trên stack và do đó được tự động giải phóng
char buffer[sizeof(T) * 2];
Đáng tiếc là điều này có thể về mặt kỹ thuật OK (Nó biên dịch). Nhưng nó không được đảm bảo để làm việc như bộ nhớ của bộ đệm có thể không được liên kết chính xác cho một T được đặt bên trong. Vì vậy, bạn phải phân bổ bộ đệm động (bằng cách sử dụng mới nó gurantees rằng bộ nhớ được sắp xếp chính xác cho bất kỳ đối tượng nào của kích thước được phân bổ (do đó, nó cũng được sắp xếp cho bất kỳ kích thước nhỏ hơn sau đó kích thước được phân bổ). vấn đề này là sử dụng một std :: vector
std::vector<char> buffer(sizeof(T) * 2);
T* t1 = new (&buffer[0] + 0 * sizeof(T)) T("Zero");
T* t2 = new (&buffer[0] + 1 * sizeof(T)) T("One");
một sử dụng các vị trí mới là để thiết lập lại một đối tượng
tôi đã thấy điều này được thực hiện nhưng tôi thích sử dụng toán tử gán chuẩn hơn:.
T obj1("Plop");
obj1 = T("Another Plop");
// Can be done like this:
T obj1("Plop");
obj1.~T();
new (&obj1) T("Another Plop"); // Seems excessive to me. But can be us-full
// in some extreme situations.
Hãy nhớ nếu bạn sử dụng phương pháp đặt lại, trước tiên bạn phải hủy đối tượng cũ (hoặc đối tượng có thể không hoạt động chính xác).
Nguồn
2010-10-18 15:46:47
Lưu ý: Vị trí mới không thường được sử dụng với int (vì nó không có lợi thế (int không có hàm tạo)). –
@Martin: Mặc dù 'new (x) int()' sẽ khác nhau và có thể được sử dụng thông qua một mẫu. Luôn luôn sử dụng parens, ngay cả với [] mới, là một ý tưởng tốt. –
Liên kết đến câu hỏi khác mà bạn thấy điều này có thể hữu ích. –