У меня нет доступа к библиотеке Boost и я пытаюсь реализовать что-то похожее на Boost any (контейнер, который может хранить несколько типов). Я нашел пример в http://learningcppisfun.blogspot.co.uk/2007/09/boostany.html, однако при компиляции я получаю ошибку сегментации. Отладка, похоже, предполагает, что это деструктор Variant, вызывающий проблему. Когда я комментирую деструктор, он работает нормально - хотя это утечка памяти. Кто-нибудь может объяснить, что происходит? Благодаря!C++ Усилить любую попытку
#include <iostream>
#include <vector>
using namespace std;
class BaseHolder
{
public:
virtual ~BaseHolder(){}
};
template<typename T>
class HoldData : public BaseHolder
{
public:
HoldData(const T& t_) : t(t_){}
T t;
};
class Variant
{
public:
template<typename T>
Variant(const T& t) : data(new HoldData<T>(t)){}
~Variant(){delete data;}
BaseHolder* data;
};
int main(){
vector<Variant> a;
int x = 10;
double y = 3.15;
a.push_back(x);
a.push_back(y);
cout << dynamic_cast<HoldData<int> *>(a[0].data)->t << endl;
cout << dynamic_cast<HoldData<double> *>(a[1].data)->t << endl;
return 0;
}
Выход:
10
3.5
У меня создалось впечатление, что переменные, данные которых в конечном счете указывают на (все, что есть в t), были построены по копиям, и поэтому не думал, что два объекта Variant могут указывать на одни и те же данные. Может быть, это не так? – user3685366
@ user3685366: Нет, это не так. Ваша переменная-член не 't', это' data'. 'data' является указателем, и этот указатель, конечно, будет скопирован. Но оба экземпляра указывают на одно и то же. На самом деле это скорее целая цель указателей! –