проблема двойной очистки памяти

пытаясь реализовать очень простой умный указатель, написал класс с 2мя конструкторами, чтобы имитировать

int *p = new int(5) // 1ый конструктор

int x = 7;
int *s = &x; //2ой конструктор

template<class T> class SmartPointer{
private:
    T* p;
public:
    SmartPointer(T* ptr):p(ptr){}
    SmartPointer(T &ptr):p(&ptr){} 
    ~SmartPointer(){delete p;} // по дебаггеру могу лишь предположить, что память очищается 2 раза
    T& get_pointer()const{ return *p; }
};

вот сам main:

int main(){
    int y = 5;
    SmartPointer<int> x = new int(5); //ок
    std::cout << x.get_pointer(); //ок
    SmartPointer<int> z = &y; //не ок
    std::cout << z.get_pointer();
    return 0;
}

на выходе: 55SimpliestSmartPointer(59021,0x1d7a5d000) malloc: *** error for object 0x16ef93598: pointer being freed was not allocated SimpliestSmartPointer(59021,0x1d7a5d000) malloc: *** set a breakpoint in malloc_error_break to debug

правильно ли я понимаю, что проблема в двойной очистке памяти? как решить в данном случае такую проблему?


Ответы (0 шт):