Sau ngày từ này: Is the destructor called when a delegating constructor throws?Bộ nhớ có được tự động thu hồi khi một nhà xây dựng ủy nhiệm ném không?
class X
{
public:
X() {};
X(int) : X() { throw std::exception(); }
X(double) { throw std::exception(); }
~X();
};
gì về bộ nhớ động? Thông thường, một ngoại lệ trong hàm tạo có nghĩa là đối tượng không được xây dựng đầy đủ và do đó bộ nhớ được dọn dẹp và không bị mất.
Nhưng đối số trong câu hỏi trước là đối tượng được xây dựng hoàn chỉnh (hoặc được khởi tạo đầy đủ) sau khi ủy nhiệm hoàn tất. Điều này ảnh hưởng đến việc đòi lại bộ nhớ như thế nào? Tôi hy vọng rằng bộ nhớ vẫn được dọn dẹp!
int main()
{
new X(5); // new called
// delete called because delegate completed.
// I assume:
// Memory re-claimed (because constructor did not complete)
// I assume the C++11 standard adjusted to compensate.
// As a constructor did complete.
}
So quá:
int main()
{
new X(5.0); // new called
// Delete **NOT** called
// Memory re-claimed (because constructor did not complete)
}
Nếu nhớ được dọn dẹp, sau đó định nghĩa về khi bộ nhớ là dọn dẹp cần phải được thay đổi từ C++ 03 spec. Hành vi đã thay đổi như thế nào?
Tiêu chuẩn nói rằng "nếu constructor không ủy nhiệm cho một đối tượng đã hoàn thành việc thực thi và một hàm khởi tạo ủy nhiệm cho đối tượng đó thoát với một ngoại lệ, hàm hủy của đối tượng sẽ được gọi ra. " Vì vậy, destructor được gọi. Nếu điều đó không trả lời câu hỏi của bạn, nó không đủ rõ ràng, ít nhất là với tôi. –
@DavidSchwartz: Không bị hủy hoại nhưng được khai hoang. Trong C++ 03 một ngoại lệ trong hàm khởi tạo không bị rò rỉ, bởi vì một ngoại lệ mà thoát khỏi hàm khởi tạo rời khỏi đối tượng không được tạo thành hoàn toàn. Nhưng ở đây đối tượng được hình thành đầy đủ. Câu hỏi của tôi thực sự là cách xử lý đã thay đổi từ C++ 03. –
@DavidSchwartz: Bạn nên đăng câu trả lời đó (lý tưởng là tham khảo). Tôi thấy đó là một điều nguy hiểm mặc dù ... –