我试图在C ++中创建一个基本的any
样式类,称为object
。它编译成功,但是在发生任何事情之前,我得到错误:Unhandled exception at 0x008128C1 in object.exe: 0xC0000005: Access violation reading location 0xCCCCCCCC.
:
#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 Held;
,您仍在执行new
。您实际上从未为Held
分配任何内容,因此当您尝试执行Held->Cast<T>(value);
时,它不会被初始化。您必须以某种方式分配Held
对象,然后才能执行此操作。
您的Data
结构也有问题。它的构造函数获取其参数的副本,然后存储指向该副本的指针。但是,该副本对于构造函数而言是本地的,并且在构造函数结束时将被销毁。 val_
指针指向被破坏的对象。不仅如此,您还可以执行delete &val_;
尝试取消分配具有自动存储持续时间的对象。
您实际上不应该尽可能多地使用new
和delete
,这样可以避免遇到许多问题。
关于c++ - C++访问冲突读取位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21386997/