C++ C++;03带free()的智能指针
我有一个需要转移所有权的char指针,如果可能的话,我不希望自己处理它的生命周期。内存是使用malloc分配的(这里没有选择) 因此,我正在寻找类似C++11的东西,它管理所有权并允许提供自定义的C++ C++;03带free()的智能指针,c++,pointers,smart-pointers,c++03,C++,Pointers,Smart Pointers,C++03,我有一个需要转移所有权的char指针,如果可能的话,我不希望自己处理它的生命周期。内存是使用malloc分配的(这里没有选择) 因此,我正在寻找类似C++11的东西,它管理所有权并允许提供自定义的Deleter 正如标题所示,我没有访问C++11特性的权限auto_ptr并不是一个常客,因为它称之为delete,而不是free 在这种情况下,是否有合适的智能指针,或者我必须自己管理内存的释放?作为自己编写的替代方法,您可以引入对Boost的依赖,只需使用Boost::shared\u ptr 但
Deleter
正如标题所示,我没有访问C++11特性的权限<就我所知,code>auto_ptr并不是一个常客,因为它称之为delete
,而不是free
在这种情况下,是否有合适的智能指针,或者我必须自己管理内存的释放?作为自己编写的替代方法,您可以引入对Boost的依赖,只需使用
Boost::shared\u ptr
但作为比较,这里有一个基于malloc
/free
的所有权转移指针的最小即兴C++11和更高版本代码,如std::unique
:
template< class Type >
class My_ptr
{
private:
Type* p_;
My_ptr( My_ptr const& ) = delete;
operator=( My_ptr const& ) -> My_ptr& = delete;
public:
auto operator->() const
-> Type*
{ return p; }
auto operator*() const
-> Type&
{ return *p; }
~My_ptr() { free( p_ ); }
My_ptr( Type* p )
: p_( p )
{}
My_ptr( My_ptr&& other )
: p_( other.p_ )
{ other.p_ = nullptr; }
};
输出:
<init>
Calling bar()...
Hello from Blah-land! :)
<destroy>
Returned from bar().
正在调用bar()。。。
你好,来自布拉兰德
从bar()返回。
免责声明:我没有为上述代码编写任何单元测试,事实上,唯一的测试是上面显示的,可以工作的。在生产代码中使用它时,测试希望它工作的各种情况是非常必要的。作为自己编写代码的替代方法,您可以引入对Boost的依赖,只需使用
Boost::shared\u ptr
但作为比较,这里有一个基于malloc
/free
的所有权转移指针的最小即兴C++11和更高版本代码,如std::unique
:
template< class Type >
class My_ptr
{
private:
Type* p_;
My_ptr( My_ptr const& ) = delete;
operator=( My_ptr const& ) -> My_ptr& = delete;
public:
auto operator->() const
-> Type*
{ return p; }
auto operator*() const
-> Type&
{ return *p; }
~My_ptr() { free( p_ ); }
My_ptr( Type* p )
: p_( p )
{}
My_ptr( My_ptr&& other )
: p_( other.p_ )
{ other.p_ = nullptr; }
};
输出:
<init>
Calling bar()...
Hello from Blah-land! :)
<destroy>
Returned from bar().
正在调用bar()。。。
你好,来自布拉兰德
从bar()返回。
免责声明:我没有为上述代码编写任何单元测试,事实上,唯一的测试是上面显示的,可以工作的。在生产代码中使用它时,测试希望它工作的各种情况是非常必要的。我想你可以自己编写(代码不太多)@UnholySheep是的,我不希望有合适的替代方案,尽管你可能想阅读。此外,考虑到您的需求,为这个特定问题编写自己的自定义包装器类应该不需要太多工作。根据智能指针的智能程度,您可以编写一个结构,在构造函数中接受您的
char*
,然后在析构函数中免费调用。这将是一个轻量级的唯一指针。(当然,您必须将copy-ctor和copy-assignment声明为private,然后不实现它们以避免复制)。Ofc您还必须复制move功能,可能是作为生成char*
指针的成员函数,然后确保在dtor
中不调用free
,您可以使用boost::shared\u ptr
。或者你可以自己写。我想你可以自己写(没有那么多代码)@unholyseep是的,我不希望有合适的替代方案,尽管你可能想读。此外,考虑到您的需求,为这个特定问题编写自己的自定义包装器类应该不需要太多工作。根据智能指针的智能程度,您可以编写一个结构,在构造函数中接受您的char*
,然后在析构函数中免费调用。这将是一个轻量级的唯一指针。(当然,您必须将copy-ctor和copy-assignment声明为private,然后不实现它们以避免复制)。Ofc您还必须复制move功能,可能是作为生成char*
指针的成员函数,然后确保在dtor
中不调用free
,您可以使用boost::shared\u ptr
。或者你可以自己编写。boost::shared_ptr
也是我的第一个想法。基本上不是。必须用适当的返回类型替换自动
返回,如果需要的话,移动模拟层替换和&
移动构造函数,而=通过适当的私有非实现成员函数删除。删除答案是因为对于C++03来说,一个所有权指针不容易正确执行。如C++ C++ 03代码> AutoPPTR <代码>用VisualC++进行不稳定的不可预测的方式。无法删除,因为它已被接受。☹考虑到OP要求C++03解决方案,接受C++11(以及更高版本)的答案似乎有点奇怪。我想那时我将不得不做C++03的事情并修改答案。boost::shared_ptr
也是我的第一个想法。几乎没有。必须用适当的返回类型替换auto
返回,如果需要的话,&&
通过移动仿真层移动构造函数,而=delete
通过适当的私有非实现成员函数。删除答案是因为对于C++03来说,单个所有权指针不容易正确执行。如C++ C++ 03代码> AutoPPTR <代码>用VisualC++进行不稳定的不可预测的方式。无法删除,因为它已被接受。☹考虑到OP要求C++03解决方案,接受C++11(以及更高版本)的答案似乎有点奇怪。我想我必须做C++03的事情,然后修改答案。