我正在实现智能指针并尝试使用它的指针向量,这样一旦它超出范围我就不必删除指针。下面是我写的程序,但它崩溃了。有人可以帮帮我吗?
#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);
}
答案 0 :(得分:3)
考虑你的智能指针类:
void CTouhouJGSView::OnBnClickedButtonUpdate() { // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. CCommand<CDynamicAccessor> cmd; CString strQuery = _T("UPDATE dbo.TouhouTable SET 능력 = 'ewrer' WHERE id = 1"); cmd.Open(m_pSet->m_session, strQuery, NULL); cmd.Close(); cmd.OpenRowset(m_pSet); //<-- you can try to close it first, if its already opened AddAllRecord(); }
它缺乏复制操作的实施,例如复制构造函数和复制赋值。您可能想要添加这些。
此外,您可能希望添加移动操作的实现(例如移动构造函数和移动赋值)。
您还可以开发一个智能指针(例如像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;}
};
)可移动但非 -copyable:它仍然可以使用STL容器,如{ {1}}。
答案 1 :(得分:1)
你有两个“智能”指针的副本; ptr
以及vector
中的副本。默认赋值运算符只是将内部指针复制到副本中,因此两个副本都指向同一个对象。这很糟糕,因为两个副本都试图删除该对象,并且只能执行一次。
如果您这样做是为了了解如何实现智能指针,我建议您阅读Scott Meyers的有效C ++书籍。但是,如果您使用现代C ++编写生产代码,则应使用std::shared_ptr
或std::unique_ptr
。