Удаление данных, возможно, хранящихся в двух разных местах

#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.