Niektórzy programiści jawnie nazywają konstruktory i destruktory w przypadku niektórych obejść. Wiem, to nie jest dobra praktyka, ale wydaje się, że robi się to, aby zrealizować pewne scenariusze. Na przykład w tym artykule Beautiful Native Libraries autor stosuje tę technikę.Czy jawnie wywołujesz konstruktory i destruktory bezpieczne, zgodnie ze standardem C++?
W poniższym kodzie, na końcu, można zauważyć, że konstruktor nazywa wprost:
#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;
}
};
Dla niektórych sytuacjach takich jak ta, może być konieczne, aby zadzwonić konstruktorów i destruktorów wyraźnie, ale co czy standard mówi: czy jest to niezdefiniowane zachowanie, czy jest to nieokreślone zachowanie, czy jest to zdefiniowane zachowanie implementacji, czy jest dobrze zdefiniowane?
Musisz tylko upewnić się, że każdy obiekt jest skonstruowany raz i zniszczony po raz –
Pamiętaj, że mówiąc ściśle, nie możesz "wywołać konstruktora". Konstruktory nie mają nazw. Są wywoływane podczas inicjowania obiektu. Jednym ze sposobów zainicjowania obiektu jest użycie 'nowego'. Jedna składnia 'nowego' to nowe miejsce docelowe, które tworzy obiekt w danej lokalizacji. – isanae