Я пытаюсь создать базовый класс стиля any
в C++, называемый object
. Он успешно компилируется, но прежде чем что-нибудь случится, я получаю ошибку: Unhandled exception at 0x008128C1 in object.exe: 0xC0000005: Access violation reading location 0xCCCCCCCC.
:C++ Чтение местоположения нарушения доступа
#include <typeinfo>
struct object
{
public:
template < typename T > struct Data
{
public:
Data(T value) : val_(&value){}
Data() : val_(nullptr){}
T* value()
{
return val_;
}
~Data()
{
delete &val_;
}
template < typename Tn > void Swap(Data<Tn>* D)
{
if (std::is_destructible<T>())
{
val_->~T();
}
Tn n_val = (Tn)val_;
std::swap<Tn>(&n_val, D->value());
}
private:
T* val_;
};
struct Inner : Data<void*>
{
template < typename T > void Cast()
{
Swap<T>(new Data<T>((T)NULL));
}
template < typename T > void Cast(const T& value)
{
Swap<T>(new Data<T>(value));
}
};
private:
Inner* Held;
public:
template < typename T > object(const T& value)
{
Held->Cast<T>(value);
}
template < typename T > void operator=(const T& value)
{
Held->Cast<T>(value);
}
template < typename T > void cast()
{
Held->Cast<T>();
}
template < typename T > void cast(const T& value)
{
Held->Cast<T>(value);
}
~object(){ delete Held; }
const void* operator()() const
{
return *Held->value();
}
};
, а затем в моем тестовом файле
#include <iostream>
int main()
{
object MyObject = 5;
std::cout << MyObject();
}
'delete &val_;' ??? – Roddy
@DavidHeffernan: 'станд :: соиЬ << MyObject();': + \t \t 'MyObject \t {Held = 0x0053a140 {...}} \t object' (VC++ Autos) – Joe
@Joe я отвалил ваш вопрос. У вас был отличный ответ. Совершенно несправедливо задавать другой вопрос о следующей проблеме, которую вы имеете. Обязательно задайте новый вопрос о своей другой проблеме. Или включите обе проблемы в один вопрос. Но не удаляйте исходный вопрос. Вы делаете ответ Джозефа глупым. –