在C 中使用智能指针时崩溃
Crashing when using smart pointer with vector in C++
我正在实现智能指针并尝试使用指针的矢量,这样我就不必一旦范围删除指针。以下是我写的程序,但它正在崩溃。有人可以帮我吗?
#include<iostream>
#include<vector>
using namespace std;
template<class T>
class smrtP
{
T *p;
public:
smrtP(T* pp = NULL):p(pp) {}
~smrtP() { delete p;}
T& operator*() {return *p;}
T* operator->() {return p;}
};
class B
{
public:
virtual void draw() = 0;
virtual ~B() { cout<<"~B"<<endl; }
};
class D:public B
{
public:
D() { cout<<"D"<<endl;}
virtual void draw()
{
cout<<"Draw D"<<endl;
}
virtual ~D() { cout<<"~D"<<endl; }
};
int main()
{
typedef smrtP<B> sp;
vector<sp> v;
sp ptr(new D());
v.push_back(ptr);
}
考虑您的智能指针类:
template<class T> class smrtP { T *p; public: smrtP(T* pp = NULL):p(pp) {} ~smrtP() { delete p;} T& operator*() {return *p;} T* operator->() {return p;} };
它缺乏复制操作的实现,例如。复制构造函数和复制分配。您可能需要添加这些。
此外,您可能需要添加移动操作的实现(例如,移动构造函数和移动分配)。
您还可以开发一个智能指针(例如std::unique_ptr
),即 themable ,但 non -copyable:它仍然可以与std::vector
这样的STL容器使用。
您可能还想阅读有关"三/五/零的规则" 在这里和这里。
您有两个"智能"指针的副本;ptr
和vector
中的副本。默认分配运算符只是将内部指针复制到副本中,因此两个副本都指向同一对象。这是不好的,因为这两个副本都试图删除对象,只能完成一次。
如果您这样做是为了了解如何实施智能指针,我建议阅读Scott Meyers的有效C 书籍。但是,如果您使用现代C 编写生产代码,则应使用std::shared_ptr
或std::unique_ptr
。
相关文章:
- 为什么要增加导致崩溃的指针
- 指针相关的UE4崩溃.我的指针哪里错了?
- 访问提升:shared_ptr 主范围外崩溃,断言失败:px != 0.指针的正确用法是什么?
- 当键是虚拟继承中涉及的基类指针时,对 std::unordered_map 项的访问崩溃
- 由于指针算法错误,代码在 memcpy 中崩溃
- 使用唯一指针调用函数会使我的程序崩溃
- 智能指针的排序向量:神秘崩溃
- 类指针方法崩溃程序
- 在C++中删除指针数组时析构函数崩溃
- 使用push_back方法获取智能指针矢量时应用崩溃
- 为什么此代码在此 Trie 实现中使用映射 c++ 中的指针崩溃?
- 从 GetProcAddress 获取的函数指针在使用 stdlib 时会使程序崩溃
- 在函数内部错误定位后,从函数中释放返回的指针会导致芯片崩溃
- 为什么此自定义指针类会崩溃?
- 为什么要删除指针崩溃wchar_t?
- C 指针崩溃(非初始化)
- 删除时指针崩溃无效,但指针不同
- 指向向量元素的指针崩溃
- 函数作用域中的指针崩溃
- 为什么指针崩溃所指向的数据会增加