умный указатель в std :: map

Я определил класс myClassодин из его членов данных

std::map<int,data*> dataMap

данные определяются как

struct data
{
int d1;
int d2;
std::string d3;
}

Вставка данных в dataMap выполняется следующим образом:dataMap[key] = new data;
следующее назначение вызывает проблему:

myClass a1,a2;
//init a1;
a2 = a1;

Я хочу использовать auto_ptr для данных вместо данных *. Как мне это сделать? —
поскольку существует проблема с уничтожением «плохих указателей для данных a1» после разрушения a2.std::map<int,std::auto_ptr<data> > проблематично скомпилировать

Upd Как вы посоветовали, я использую std :: shared_ptr, но это все еще вызывает проблемы:
в VS10

error C2440: 'delete' : cannot convert from 'std::tr1::shared_ptr<_Ty>' to 'void *'
1>          with
1>          [
1>              _Ty=data
1>          ]

Можете ли вы написать пример кода, указывающий правильный способ использования shared_ptr

1

Решение

Для этой ошибки:
error C2440: 'delete' : cannot convert from 'std::tr1::shared_ptr<_Ty>' to 'void *'
Вам не нужно удалять мгновение shared_ptr. Shared_ptr будет содержать ресурс ( new data) со счетчиком ссылок и автоматически удаляет его, когда счетчик ссылок равен 0, что означает, что ресурс вообще не использовался. Увидеть руководство по shared_ptr для деталей

1

Другие решения

С помощью auto_ptr плохая идея (она устарела) в целом и даже хуже в сочетании со стандартными контейнерами.

Предпочитаю лучше разработан std::shared_ptr или же std::unique_ptr (в зависимости от вашей ситуации), и ваш код будет работать с одним исключением: вам нужно создать правильный тип интеллектуального указателя при попытке вставить его в контейнер, так как интеллектуальные указатели неявно могут быть созданы из необработанных указателей.

4

std::auto_ptr не безопасно использовать в контейнерах, поэтому он устарел. использование std::shared_ptr или же boost::shared_ptr если доступно.

Вы также можете использовать std::unique_ptr если уместно и доступно, но это немного сложнее.

1

Вы можете использовать либо std::unique_ptr в C ++ 11, если у вас есть уникальное право собственности (то есть, объект никогда не будет совместно использоваться, и только создатель может уничтожить его снова), или вы можете использовать std::shared_ptr если у вас будет общая собственность.

Если вы используете C ++ 03, вы можете использовать boost::shared_ptr или же boost::unique_ptr вместо.

1
По вопросам рекламы [email protected]