Znalazłem kod używający std :: shared_ptr do wykonania dowolnego czyszczenia przy wyłączaniu. Na początku myślałem, że ten kod nie może działać, ale potem wypróbowałem następujące:
#include <memory>
#include <iostream>
#include <vector>
class test {
public:
test() {
std::cout << "Test created" << std::endl;
}
~test() {
std::cout << "Test destroyed" << std::endl;
}
};
int main() {
std::cout << "At begin of main.\ncreating std::vector<std::shared_ptr<void>>"
<< std::endl;
std::vector<std::shared_ptr<void>> v;
{
std::cout << "Creating test" << std::endl;
v.push_back( std::shared_ptr<test>( new test() ) );
std::cout << "Leaving scope" << std::endl;
}
std::cout << "Leaving main" << std::endl;
return 0;
}
Ten program daje wynik:
At begin of main.
creating std::vector<std::shared_ptr<void>>
Creating test
Test created
Leaving scope
Leaving main
Test destroyed
Mam kilka pomysłów, dlaczego to może zadziałać, które mają związek z wewnętrznymi elementami std :: shared_ptrs zaimplementowanymi dla G ++. Ponieważ obiekty te zawijają wewnętrzny wskaźnik razem z licznikiem, z którego rzutowanie std::shared_ptr<test>
do std::shared_ptr<void>
prawdopodobnie nie przeszkadza w wywołaniu destruktora. Czy to założenie jest słuszne?
I oczywiście o wiele ważniejsze pytanie: czy to gwarantuje normalne działanie, czy może dalsze zmiany w wewnętrznych elementach std :: shared_ptr, inne implementacje faktycznie psują ten kod?