Чтобы решить очень специфическую проблему в моем приложении, мне нужен общий указатель на выделенные данные, но во внешний мир основной тип данных должен оставаться скрытым.
Я мог бы решить это, создав какой-то класс Root, который наследует все мои другие классы, и используйте shared_ptr для этого класса Root, например:
std::shared_ptr<Root>
Однако:
- Я не хочу, чтобы все мои классы наследовали этот класс Root, чтобы иметь этот общий указатель
- Иногда я хочу вернуть общий указатель на std::vector, или std:: list, или std:: set,... которые, очевидно, не наследуются от моего класса Root
Странно, кажется, что вы можете создать shared_ptr на void, и это, похоже, работает правильно, как показано в этом примере:
class X
{
public:
X() {std::cout << "X::ctor" << std::endl;}
virtual ~X() {std::cout << "X::dtor" << std::endl;}
};
typedef std::shared_ptr<void> SharedVoidPointer;
int main()
{
X *x = new X();
SharedVoidPointer sp1(x);
}
x правильно удален, и в более крупном эксперименте я могу проверить, что общий указатель действительно делает то, что ему нужно сделать (удалить x afer, последний shared_ptr получится свет).
Конечно, это решает мою проблему, так как теперь я могу вернуть данные с помощью элемента данных SharedVoidPointer и убедиться, что он правильно очищен там, где он должен быть.
Но гарантируется ли это во всех случаях? Он явно работает в Visual Studio 2010, но верно ли это также для других компиляторов? На других платформах?