Я нашел некоторый код, используя std:: shared_ptr для выполнения произвольной очистки при завершении работы. Сначала я думал, что этот код не может работать, но затем я попробовал следующее:
#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;
}
Эта программа выводит результат:
At begin of main.
creating std::vector<std::shared_ptr<void>>
Creating test
Test created
Leaving scope
Leaving main
Test destroyed
У меня есть некоторые идеи о том, почему это может сработать, которые связаны с внутренними стандартами std:: shared_ptrs, реализованными для g++. Поскольку эти объекты обертывают внутренний указатель вместе с счетчиком, то отличное от std::shared_ptr<test>
до std::shared_ptr<void>
, вероятно, не мешает вызову деструктора. Правильно ли это предположение?
И, конечно, гораздо более важный вопрос: гарантированно ли это работать по стандарту или может быть изменено внутреннее значение std:: shared_ptr, другие реализации действительно нарушают этот код?