手写智能指针SharedPtr
template <T>
class SharedPtr {
private:
size_t* m_counter_;
T* m_ptr_;
public:
SharedPtr():m_counter_(new size_t),m_ptr_(new T){
m_counter_ = 1;
}
SharedPtr(T* ptr)::m_counter_(new size_t),m_ptr_(ptr){
m_counter_ = 1;
}
~SharedPtr(){
--(*m_counter_);
if (*m_counter_ == 0) {
delete m_counter_;
delete m_ptr_;
m_ptr_ = nullptr;
m_counter_ = nullptr;
}
}
SharedPtr(const SharedPtr& ptr) {
m_counter_ = ptr.m_counter_;
m_ptr_ = ptr.m_ptr_;
++(*m_counter_);
}
void operator=(const SharedPtr& ptr) {
SharedPtr(std::move(ptr));
}
SharedPtr(SharedPtr&& ptr) {
m_counter_ = ptr.m_counter_;
m_ptr_ = ptr.m_ptr_;
++(*m_counter_);
}
void operator=(SharedPtr&& ptr) {
SharedPtr(std::move(ptr));
}
T& operator*() {
return *m_ptr_;
}
T* operator->(){
return m_ptr_;
}
bool operator ==(){
return m_ptr_ == nullptr;
}
T* get(){
return m_ptr_;
}
size_t use_count(){
return *m_count_;
}
bool unique(){
return *m_count_ == 1;
}
void swap(SharedPtr& ptr) {
std::swap(*this, ptr);
}
}
手写memcpy()函数
void* memcpy(void* dest, void* src, size_t num){
char* p1 = (char*) dest;
char* p2 = (char*) src;
if (p1 < p2) {
for(size_t i = 0; i < num; i++) {
*(p1++) = *(p2++);
}
}
else {
p1 += num - 1;
p2 += num - 1;
for (size_t i =0; i < num; i++) {
*(p1--) = *(p2--);
}
}
}