我试图在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_;尝试取消分配具有自动存储持续时间的对象。

您实际上不应该尽可能多地使用newdelete,这样可以避免遇到许多问题。

关于c++ - C++访问冲突读取位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21386997/

10-12 01:29