#c #new-operator
#c #new-оператор
Вопрос:
У меня есть программа, делающая что-то вроде следующего:
class SomeObject{}
{
void function(int x, int y);
void function(SomeOtherObject *z);
SomeOtherObject *ptrToObj;
}
SomeObject::function(int x, int y)
{
ptrToObj = new SomeOtherObject(x, y);
}
SomeObject::function(SomeOtherObject *z)
{
ptrToObj = z;
}
Моя проблема в том, что я не знаю наилучшего способа обработки удаления этого нового объекта, когда я хочу избавиться от экземпляра SomeObject или инициализировать его, поскольку я не могу рассчитывать на то, что он действительно был создан SomeObject . (менеджер обрабатывает удаление, если SomeObject передается указатель)
Варианты, о которых я подумал:
- Скопируйте объект и укажите на него. (Наличие двух копий кажется беспорядочным, хотя объект не такой большой)
- Создайте логическое значение, которое устанавливается, если объект необходимо удалить. (это просто немного странно и халтурно)
- Создайте другой указатель для хранения объекта, созданного SomeObject, вместо этого укажите ptrToObj на этот указатель, когда он будет назначен. (таким образом, в принципе, вы знаете, что второй указатель можно безопасно удалить, если он не равен NULL)
- Реализуйте указатель с подсчетом ссылок. (это немного больше, чем я хотел бы рассмотреть для этого)
Я сделал третий, но я знаю, что должен быть лучший способ справиться с этой проблемой!
Ответ №1:
Используйте shared_ptr
либо из Boost, либо из последней библиотеки C (0x). shared_ptr
подсчет ссылок выполняется за вас.
Ответ №2:
Этот случай может быть решен с помощью shared_ptr
, как отвечалось ранее, но я рекомендую прочитать о стратегиях smart pointers для других. Я нашел интересное краткое описание методов и в каких случаях их следует использовать.
Ответ №3:
Если вы не хотите использовать интеллектуальные указатели, посмотрите на observer DP.