shared_ptr <T []>包装动态数组的问题

pri*_*tor 5 c++ shared-ptr c++11

我想用我的类替换一些原始指针,std::shared_ptr以便在创建该类的副本时我不必担心.但原始指针指向动态数组.当您为其提供自定义删除器时,可以使用带动态数组的shared_ptr,例如:G.default_delete<T[]>.

但是,当我尝试为该字段分配新值时,即使在构造时,我也会得到一个大错误列表.

这是一个最小的代码示例:

#include <memory>
#include <cstddef>

using namespace std;

template<typename T> shared_ptr<T[]> make_shared_array(size_t size)
{
  return shared_ptr<T[]>(new T[size], default_delete<T[]>());
}

struct Foo
{
  shared_ptr<char[]> field;
};

int main()
{
  Foo a;
  // This line produces the error.
  a.field = make_shared_array<char>(256);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

NB:是的,我知道我可以/应该vector而不是动态数组.但他们的表现并不相同.我做了一些繁重的图像处理,数组保持像素.在低于VGA分辨率的情况下,处理时间从8秒增加到11秒.那是非常多的.


更新:当然我可以在这里提供错误.我只是不知道我是否应该用它弄乱问题描述.但这里是:

C:\ Program Files(x86)\ Microsoft Visual Studio 11.0\VC\INCLUDE\memory(754):错误C2664:'std :: _ Ptr_base <_Ty> :: _ Reset0':无法将参数1从'char '转换为'char ()[]'

[
_Ty = char []
]
指向的类型无关; 转换需要reinterpret_cast,C风格的转换或函数式转换
C:\ Program Files(x86)\ Microsoft Visual Studio 11.0\VC\INCLUDE\memory(723):请参阅函数模板实例化'void std :: shared_ptr <_Ty > :: _ Resetp0 <_Ux>(_的Ux*,性病:: _ Ref_count_base*)"被编译

[
_Ty =炭[],
_Ux =炭
]
C:\程序文件(x86)\微软的Visual Studio 11.0\VC\INCLUDE\memory(723):参见函数模板实例化'void std :: shared_ptr <_Ty> :: _ Resetp0 <_Ux>(_ Ux*,std :: _ Ref_count_base*)'正在

[
_Ty = char [] 编译,
_Ux = char
]
C:\ Program Files(x86)\ Microsoft Visual Studio 11.0\VC\INCLUDE\memory(494):参见函数模板实例化'void std :: shared_ptr <_Ty> :: _ Resetp <_Ux,_Dx>(_ Ux*,_Dx)'正在
使用
[
_Ty = char [],
_Ux = char,
_Dx = std :: default_delete
] 编译
C:\ Program Files(x86)\ Microsoft Visual Studio 11.0\VC\INCLUDE\memory(494):参见参考资料函数模板实例化'void std :: shared_ptr <_Ty> :: _ Resetp <_Ux,_Dx>(_ Ux*,_ Dx)'

[
_Ty = char [],
_Ux = char,
_Dx = std :: default_delete
]
problem.cpp(9)编译:参见函数模板实例化'std :: shared_ptr <_Ty> :: shared_ptr>(_ Ux*, _Dx)'正在
使用
[
_Ty = char [] 编译,
T = char,
_Ux = char,
_Dx = std :: default_delete
]
problem.cpp(9):参见函数模板实例化'std :: shared_ptr <_Ty>: :shared_ptr>(_ Ux*,_ Dx)'

[
_Ty = char [] 编译,
T = char,
_Ux = char,
_Dx = std :: default_delete
]
problem.cpp(21):参见函数模板实例化'std :: shared_ptr <_Ty> make_shared_array(size_t)'

[
_Ty = char []
] 编译

dar*_*rak 8

你建议的解决方案是可能的,但你将失去数组的大小:

#include <memory>
#include <cstddef>

using namespace std;

template<typename T> shared_ptr<T> make_shared_array(size_t size)
{
   return shared_ptr<T>(new T[size], default_delete<T[]>());
}

struct Foo
{
  shared_ptr<char> field;
};

int main()  
{
  Foo a;
  a.field = make_shared_array<char>(256);

 return 0;
}
Run Code Online (Sandbox Code Playgroud)

我在这里做的是让数组衰减成指针.只要删除器是数组删除器,它就应该正常运行.

为了防止大小的这种损失,如果你不能使用boost :: shared_array的建议,我会建议封装在自己的shared_array类信息.