Có thể viết một con trỏ thông minh phân bổ chính đối tượng trong hàm tạo của nó - thay vì nhà phát triển phải gọi new
? Nói cách khác, thay vì viết:Tại sao một con trỏ thông minh không thể gọi hàm new() cho tôi trong hàm tạo của nó?
std::unique_ptr<myClass> my_ptr(new myClass(arg1, arg2))
... người ta có thể viết:
std::smarter_ptr<myClass> my_ptr(arg1, arg2)
là cú pháp ngôn ngữ có khả năng thể hiện này? Điều này có được mong muốn không? Hiếm? Tôi đang nghĩ đến đặc biệt bảo vệ chống lại sai lầm này (mà tôi đã thực hiện bản thân mình, tất nhiên):
myFunction(std::unique_ptr<myClass>(new myClass()), std::unique_ptr<myClass>(new myClass()))
... mà có nguy cơ bị rò rỉ bất cứ đối tượng được phân bổ đầu tiên nếu việc phân bổ thứ hai xảy ra và ném trước khi đối tượng đầu tiên được giữ an toàn trong con trỏ thông minh của nó. Nhưng một con trỏ thông minh hơn có thực sự làm việc này an toàn không?
@Joe: Đó là mối quan tâm; hoàn toàn có thể cho mã được tạo ra để thực thi hai biểu thức 'mới' trước khi sử dụng kết quả để khởi tạo một con trỏ thông minh; trong trường hợp đó bạn sẽ bị rò rỉ nếu cái thứ hai ném. –
@Joe: Bạn sai rồi. 'tmp1 = new myClass(); tmp2 = new myClass(); arg1 = std :: unique_ptr (tmp1); arg2 = std :: unique_ptr (tmp2); myFunction (arg1, arg2); 'là một trật tự thực thi pháp lý hoàn hảo. –
Đủ công bằng, tôi đã tìm cách chứng minh bản thân mình không chính xác. Cảm ơn. – Joe