2014-10-07 2 views
-1

У меня есть указатель, который нарезанный, но я точно не знаю, где и почему. Есть две строки кода, которые я думаю, может привести к сплайсинга:Имеет ли разрез с unique_ptr?

Создание уникального указателя:

map.insert(make_pair("ChildA", unique_ptr<Base>(new ChildA()))); 

и возвращение сырой указатель из моего уникального указателя:

return map["ChildA"].get(); 

Отметьте, что:

  • Класс ChildA наследует Основание
  • Base имеет виртуальный деструктор
  • карту в приведенном выше примере типа:

    map<string, unique_ptr<Base> > 
    

происходят ли сплайсинг в одном из строк кода, указанных выше? Есть ли простой способ избежать, где это происходит?

+1

Вы имели в виду 'return map [" ChildA "]. Get()' right? – WhozCraig

+1

'return map [ChildA] .get()' недопустимый код - всегда [post REAL code] (http://stackoverflow.com/help/mcve). – Angew

+2

IIRC, разрезание происходит только на копии объектов ценности; так что не ссылки, а не указатели (даже когда в умном указателе). Таким образом, это будет зависеть от того, что тип в сигнатуре функции, которая содержит 'return map [ChildA] .get();'. Что такое подпись и как используется результат? – Niall

ответ

0

В коде, который вы опубликовали, нет фрагментов, насколько я могу судить.

Демо: http://ideone.com/8InZ6H

нарезка будет происходить, если вы пытаетесь скопировать Child1 в Base по значению. Вы уверены, что не делаете это нигде в своем коде?