Jeśli przez "lepsze podejście" rozumiesz "bezpieczniejsze podejście", to tak, zaimplementowałem tutaj "inteligentny wskaźnik", który nie jest właścicielem: https://github.com/duneroadrunner/SaferCPlusPlus. (Shameless alert wtyczki, ale myślę, że to istotne tutaj.) Tak Twój kod będzie wyglądać następująco:
#include "mseregistered.h"
...
class foo{
public:
mse::TRegisteredPointer<bar> pntr;
};
int main(){
mse::TRegisteredObj<bar> a;
foo b;
b.pntr=&a;
}
TRegisteredPointer jest „mądrzejszy” od surowych wskaźników w tym, że nie wie, kiedy cel zostanie zniszczony. Na przykład:
int main(){
foo b;
bar c;
{
mse::TRegisteredObj<bar> a;
b.pntr = &a;
c = *(b.pntr);
}
try {
c = *(b.pntr);
} catch(...) {
// b.pntr "knows" that the object it was pointing to has been deleted so it throws an exception.
};
}
TRegisteredPointer generalnie ma niższy koszt wydajności niż powiedz, std :: shared_ptr. Znacznie niższe, gdy masz możliwość przydzielenia obiektu docelowego na stosie. Jest to wciąż całkiem nowa wersja i nie jest jeszcze dobrze udokumentowana, ale biblioteka zawiera skomentowane przykłady jej użycia (w pliku "msetl_example.cpp", w dolnej połowie).
Biblioteka zapewnia również TRegisteredPointerForLegacy, która jest nieco wolniejsza niż TRegisteredPointer, ale może być używana jako zastępczy wskaźnik surowych wskaźników w prawie każdej sytuacji. (W szczególności może być użyty, zanim typ docelowy zostanie całkowicie zdefiniowany, co nie ma miejsca w przypadku TRegisteredPointer.)
Pod względem sentymentu twojego pytania, myślę, że jest ono ważne. Do tej pory programiści C++ powinni przynajmniej mieć możliwość uniknięcia niepotrzebnego ryzyka nieprawidłowego dostępu do pamięci. Surowe wskaźniki również mogą być ważną opcją, ale myślę, że zależy to od kontekstu. Jeśli jest to złożone oprogramowanie, w którym bezpieczeństwo jest ważniejsze niż wydajność, bezpieczniejsza alternatywa może być lepsza.
Powinieneś naprawdę połączyć się z [ostatnią wersją (N4282)] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4282.pdf) lub [' std :: experimental :: observer_ptr' (http://en.cppreference.com/w/cpp/experimental/observer_ptr). Ponadto "reference_wrapper" jest opcją, jeśli wskaźnik nigdy nie powinien mieć wartości NULL. –
@ T.C. Dzięki, gotowe. – vsoftco
@ T.C. Btw, czy znasz jakieś wdrożenie, które ma ""? Próbuję g ++ 5.3 i clang ++ 3.7, ale nagłówek nie jest zaimplementowany. –
vsoftco