Một số nhà phát triển gọi cho nhà thầu và người phá hủy một cách rõ ràng đối với một số cách giải quyết. Tôi biết, nó không phải là một thực hành tốt, nhưng có vẻ như nó được thực hiện để nhận ra một số kịch bản.Được gọi một cách rõ ràng các nhà xây dựng và phá hủy an toàn, theo tiêu chuẩn C++?
Ví dụ: trong bài viết này, Beautiful Native Libraries, tác giả sử dụng kỹ thuật này.
Trong đoạn mã dưới đây, ở cuối, nó có thể được nhìn thấy rằng các nhà xây dựng được gọi một cách rõ ràng:
#include <limits>
template <class T>
struct proxy_allocator {
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef T *pointer;
typedef const T *const_pointer;
typedef T& reference;
typedef const T &const_reference;
typedef T value_type;
template <class U>
struct rebind {
typedef proxy_allocator<U> other;
};
proxy_allocator() throw() {}
proxy_allocator(const proxy_allocator &) throw() {}
template <class U>
proxy_allocator(const proxy_allocator<U> &) throw() {}
~proxy_allocator() throw() {}
pointer address(reference x) const { return &x; }
const_pointer address(const_reference x) const { return &x; }
pointer allocate(size_type s, void const * = 0) {
return s ? reinterpret_cast<pointer>(yl_malloc(s * sizeof(T))) : 0;
}
void deallocate(pointer p, size_type) {
yl_free(p);
}
size_type max_size() const throw() {
return std::numeric_limits<size_t>::max()/sizeof(T);
}
void construct(pointer p, const T& val) {
new (reinterpret_cast<void *>(p)) T(val);
}
void destroy(pointer p) {
p->~T();
}
bool operator==(const proxy_allocator<T> &other) const {
return true;
}
bool operator!=(const proxy_allocator<T> &other) const {
return false;
}
};
Đối với một số tình huống như thế này, nó có thể là cần thiết để gọi constructor và destructor một cách rõ ràng, nhưng những gì không tiêu chuẩn nói: là nó không xác định hành vi, là nó không xác định hành vi, là nó thực hiện xác định hành vi, hoặc là nó cũng được xác định?
Bạn chỉ cần đảm bảo rằng mỗi đối tượng được xây dựng một lần và bị hủy một lần –
Lưu ý rằng nói đúng, bạn không thể "gọi hàm tạo". Các nhà xây dựng không có tên. Chúng được gọi trong khi khởi tạo một đối tượng. Một cách để khởi tạo một đối tượng là sử dụng 'new'. Một cú pháp của 'mới' là vị trí mới, cấu trúc một đối tượng tại một vị trí nhất định. – isanae