从自定义分配器

时间:2016-01-21 13:26:11

标签: c++ memory-management

Visual Studio没有向我解释任何内容,它只是打破了我并方便地发送给operator delete实现....

为什么无法解除分配?

#include <iostream>

template<typename T>
struct Allocator
{
    using size_type = std::size_t;
    using pointer = T*;

    pointer allocate(size_type n)
    {
        return static_cast<pointer>(::operator new(n * sizeof(T)));
    }

    void deallocate(pointer p)
    {
        ::operator delete((void*)p);
    }
};

int main()
{
    Allocator<int> al;

    int a = 5;
    int* p = al.allocate(1);
    p = &a;
    al.deallocate(p);
}

1 个答案:

答案 0 :(得分:3)

除了分配的内容之外,您还要释放其他内容。

您正在分配,将结果分配给p,然后立即使用您尝试解除分配的其他随机指针覆盖结果。

崩溃的原因应该是显而易见的。

P.S。就Visual Studio而言,它正确地将您带到发生非法内存访问的行。可悲的是,现代技术的状态还没有到那时你还能详细解释到底出了什么问题。