【发布时间】:2020-11-18 15:08:24
【问题描述】:
我是 C++ 新手,正在尝试对 shared_ptr (WIP) 做一个非常基本的实现。我试图在通过取消引用找到基础值后立即删除析构函数中的堆分配指针。虽然取消引用发生得很好,但删除 '''ref_count''' 变量会导致问题。有人可以帮忙吗? '''
#include<iostream>
template<typename T>
class shared_ptr{
private:
T* native_ptr_ = nullptr;
int* ref_count_ = nullptr;
inline void increment_count() {
*ref_count_++;
}
inline void decrement_count() {
*ref_count_--;
}
public:
shared_ptr() {
std::cout << "shared_ptr: empty constructor" << std::endl;
native_ptr_ = nullptr;
ref_count_ = nullptr;
}
shared_ptr(T* ptr) {
std::cout << "shared_ptr: constructor" << std::endl;
if (ptr) {
native_ptr_ = ptr;
ref_count_ = new int(1);
}
}
~shared_ptr() {
std::cout << "shared_ptr: destructor" << std::endl;
if (ref_count_) {
decrement_count();
if (ref_count_ && use_count() == 0) {
std::cout << *ref_count_ << " " << *native_ptr_ << std::endl;
delete ref_count_;
delete native_ptr_;
ref_count_ = nullptr;
native_ptr_ = nullptr;
}
}
}
int use_count() const {
if(ref_count_) {
return *ref_count_;
} else {
return 0;
}
}
};
int main() {
// case1
int* temp = new int(0);
shared_ptr<int> a1(temp);
return 0;
}
'''
'''
shared_ptr: constructor
shared_ptr: destructor
0 0
free(): invalid pointer
Aborted (core dumped)
'''
【问题讨论】:
-
这就是你所拥有的一切吗?这段代码不应该给你那个错误。
-
调试指针问题时的提示:检查实际的指针值,而不是它所指向的数据。
-
@OP 除非您将
shared_ptr的版本放在其自己的命名空间中,否则您应该将其命名为shared_ptr以外的其他名称。已经有一个std::shared_ptr。 -
@PaulMcKenzie 我不同意,
std::shared_ptr已经在命名空间中。using namespace std不好,不应该使用。 -
using namespace std:是否不好并不是重点。 C++ 程序员在代码中只看到shared_ptr就会立即相信所指的是std::shared_ptr。无论如何,为可能与std::名称冲突的名称创建命名空间是一种很好的方式。
标签: c++ shared-ptr destructor delete-operator reference-counting