Tôi nhận ra điều này là thiếu khôn ngoan, và tôi không đề xuất để làm điều đó, nhưng tôi tò mò về việc liệu sau đây là thực sự chính thức bất hợp pháp:Có phải mô phỏng bằng tay hiệu ứng của toán tử xóa trong C++ một cách chính thức bất hợp pháp không?
#include <iostream>
struct X
{
~X()
{
std::cout << "~X()\n";
}
};
int main()
{
X *x = new X;
//delete x;
x->~X();
::operator delete(x);
return 0;
}
Đó là sự hiểu biết của tôi rằng delete x;
tương đương với gọi destructor và sau đó gọi ::operator delete(x);
, nhưng nó là hợp pháp đối với tôi để làm điều đó theo cách thủ công theo tiêu chuẩn? Tôi biết đây là một điều hợp lệ khi sử dụng vị trí mới, nhưng trong trường hợp không phải là vị trí thì sao? Linh cảm của tôi là nó có thể là bất hợp pháp vì delete
(và không phải operator delete
) phải được thực hiện cho mỗi new
, nhưng tôi muốn được biết chắc chắn.
bạn đang hỏi liệu 'xóa x;' có tương đương với cách gọi hàm hủy và sau đó 'toán tử xóa (x);' cho * mẫu mã cụ thể này * hay * nói chung *? –
@Ben: Trong mẫu mã cụ thể này - nhưng tôi cũng quan tâm đến trường hợp chung (mà bây giờ tôi giả định câu trả lời là không). –
Rất vui khi tôi hỏi câu hỏi này - có rất nhiều câu trả lời hơn tôi tưởng tượng. –