Проблемы с обёртыванием динамического массива shared_ptr <T []>
Я хотел заменить некоторые сырые указатели в моем классеstd::shared_ptr
так что я нене нужно беспокоиться, когда я создаю копии этого класса. Но необработанные указатели указывают на динамический массив. Использование shared_ptr с динамическими массивами возможно, когда вы предоставляете ему пользовательское удаление, e.г. ,default_delete
Но я получаю большой список ошибок, как только я пытаюсь присвоить этому полю новое значение, даже в процессе строительства.
Вот'минимальный пример кода:
#include
#include
using namespace std;
template shared_ptr make_shared_array(size_t size)
{
return shared_ptr(new T[size], default_delete());
}
struct Foo
{
shared_ptr field;
};
int main()
{
Foo a;
// This line produces the error.
a.field = make_shared_array(256);
return 0;
}
NB: Да, я знаю, что мог / долженvector
вместо динамических массивов. Но их производительность не одинакова. Я делаю тяжелую обработку изображений, и массивы содержат пиксели. При разрешении менее VGA время обработки увеличилось с 8 до 11s. Тот'довольно много.
Обновить: Конечно, я могу сообщить об ошибках здесь. Я просто нене знаю, стоит ли мне загромождать описание проблемы этим. Но вот оно:
C: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ VC \ INCLUDE \ memory (754): ошибка C2664: 'станд :: _ Ptr_base <_Ty>:: _ Reset0' : невозможно преобразовать параметр 1 из '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 *, std :: _ Ref_count_base *) ' компилируется
с[
_Ty = char [],
_Ux = символ]
C: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ VC \ INCLUDE \ memory (723): см. Ссылку на создание экземпляра шаблона функции 'void std :: shared_ptr <_Ty>:: _ Resetp0 <_Ux>(_Ux *, std :: _ Ref_count_base *) ' компилируется
с[
_Ty = char [],
_Ux = символ]
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 = символ,
_Dx = станд :: 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 = символ,
_Dx = станд :: default_delete]
problem.cpp (9): см. ссылку на создание шаблона функции 'станд :: shared_ptr <_Ty>:: shared_ptr>(_Ux *, _ Dx) ' компилируется
с[
_Ty = char [],
Т = символ,
_Ux = символ,
_Dx = станд :: default_delete]
problem.cpp (9): см. ссылку на создание шаблона функции 'станд :: shared_ptr <_Ty>:: shared_ptr>(_Ux *, _ Dx) ' компилируется
с[
_Ty = char [],
Т = символ,
_Ux = символ,
_Dx = станд :: default_delete]
problem.cpp (21): см. ссылку на создание шаблона функции 'станд :: shared_ptr <_Ty> make_shared_array (size_t)» компилируется
с[
_Ty = char []]