Да, все будет плохо, если вы явно не определите copy constructor
и copy assignment operator
для своего класса.
Контейнеры STL, такие как vector
, имеют семантику копирования по значению .Когда объект Star
копируется в vector
, копируется необработанный указатель внутри него.Таким образом, теперь у вас есть несколько указателей, указывающих на одну память, что определенно позволяет вам в лучшем случае перейти к неопределенному поведению.
Что вам следует сделать, это определить эти функции явно.Вручную выполните глубокую копию этой памяти и правильно увеличьте счетчик ссылок.
Лучшим способом является удержание RAII-объекта, подобного boost::shared_ptr
или std::tr1::shared_ptr
, внутри вашего класса ион обрабатывает управление ресурсами (включая подсчет ссылок) автоматически для вас.Тогда вам больше не нужно явно определять эти функции.
class Star
{
..
private:
std::tr1::shared_ptr<sf::Texture> m_starTexture;
};
// link the smart pointer w/ resource
Star::Star(): m_starTexture(new Texture())
{
...
}
Это гарантированно будет работать с помощью функций языка:
- Когда ваш объект копируется, функции копированиянестатических объектов-членов называются .
- Когда ваш объект удаляется, деструкторы нестатических объектов-членов называются .
В этом случае функции копирования интеллектуального указателя будут правильно увеличивать refсчитать, в то время как его деструктор уменьшает счетчик ссылок и освобождает ресурс, если счетчик ссылок равен 0.