Я определил класс 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
Для этой ошибки:
error C2440: 'delete' : cannot convert from 'std::tr1::shared_ptr<_Ty>' to 'void *'
Вам не нужно удалять мгновение shared_ptr. Shared_ptr будет содержать ресурс ( new data
) со счетчиком ссылок и автоматически удаляет его, когда счетчик ссылок равен 0, что означает, что ресурс вообще не использовался. Увидеть руководство по shared_ptr для деталей
С помощью auto_ptr
плохая идея (она устарела) в целом и даже хуже в сочетании со стандартными контейнерами.
Предпочитаю лучше разработан std::shared_ptr
или же std::unique_ptr
(в зависимости от вашей ситуации), и ваш код будет работать с одним исключением: вам нужно создать правильный тип интеллектуального указателя при попытке вставить его в контейнер, так как интеллектуальные указатели неявно могут быть созданы из необработанных указателей.
std::auto_ptr
не безопасно использовать в контейнерах, поэтому он устарел. использование std::shared_ptr
или же boost::shared_ptr
если доступно.
Вы также можете использовать std::unique_ptr
если уместно и доступно, но это немного сложнее.
Вы можете использовать либо std::unique_ptr
в C ++ 11, если у вас есть уникальное право собственности (то есть, объект никогда не будет совместно использоваться, и только создатель может уничтожить его снова), или вы можете использовать std::shared_ptr
если у вас будет общая собственность.
Если вы используете C ++ 03, вы можете использовать boost::shared_ptr
или же boost::unique_ptr
вместо.