проблема двойной очистки памяти
пытаясь реализовать очень простой умный указатель, написал класс с 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
правильно ли я понимаю, что проблема в двойной очистке памяти? как решить в данном случае такую проблему?