Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;03带free()的智能指针_C++_Pointers_Smart Pointers_C++03 - Fatal编程技术网

C++ C++;03带free()的智能指针

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 但

我有一个需要转移所有权的char指针,如果可能的话,我不希望自己处理它的生命周期。内存是使用malloc分配的(这里没有选择)

因此,我正在寻找类似C++11的东西,它管理所有权并允许提供自定义的
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的事情,然后修改答案。