2016-01-21 2 views
0

Visual Studio не объясняет мне ничего, он просто ломает и посылает мне удобно в operator delete реализации ....Необъяснимого исключения брошенного вызывающего DEALLOCATE из пользовательского распределителя

Почему не в состоянии освободить?

#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

@JoachimPileborg Извинения. Пропустил несколько деталей. Ред. – DeiDei

+4

Итак, вы освобождаете переменную с автоматическим хранилищем и задаетесь вопросом, почему она ломается? – StoryTeller

ответ

3

Вы освобождаете что-то еще, кроме того, что вы выделили.

Вы назначаете результат, присваивая результат p, а затем сразу же перезаписываете результат каким-либо другим случайным указателем, который вы пытаетесь освободить.

Причина вашей аварии должна быть очевидной.

P.S. Что касается Visual Studio, он корректно выводит вас на линию, где происходил незаконный доступ к памяти. К сожалению, состояние современных технологий еще не дошло до того, что вы также получите подробное объяснение того, что именно пошло не так, на тот момент.

+0

Я не уверен, что это печально. В тот момент, когда это произойдет, мы все будем бросать гамбургеры. – SergeyA

Смежные вопросы