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 []
] 编译
你建议的解决方案是可能的,但你将失去数组的大小:
#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类信息.
| 归档时间: |
|
| 查看次数: |
6293 次 |
| 最近记录: |