почему VS2013 генерирует исключение при уничтожении уникального указателя?

0

Можете ли вы дать представление о том, что означает это исключение, и почему оно вызывается только тогда, когда unique_ptr is! = Nullptr?

Код компилирует и запускает исключения исключения.

Уникальный указатель pFace2, похоже, генерирует исключение при его уничтожении.
Он не генерирует исключение, когда он == nullptr.

Информация об исключении VS2013:

Исключение первого шанса в 0x00CA6A0C в Network.exe: 0xC0000005: место записи нарушения доступа 0xCCCCCCD0.

Если для этого исключения есть обработчик, программа может быть безопасно продолжена.

Код:

 for (auto volume : domain) {
        std::cout << "Volume " << volume->getID() << "\n";
        for (auto face : volume->volumeFaces) {

      auto pNeighbourVolume = std::find_if(
          domain.begin(), domain.end(), [&](std::shared_ptr<controlVolume> i) {
            return i->getID() == face.getNeighbour();
          });

      if (pNeighbourVolume != domain.end()) {
        std::cout << "  connected to " << (*pNeighbourVolume)->getID() << "\n";

        //This pointer     
        std::unique_ptr<cvVolumeFace> pFace2 = (*pNeighbourVolume)->matchingFace(face); 

        std::cout << "\n";
      } //<- here is where code breaks
    }
    std::cout << "\n\n";
  }

определение типа соответствия:

std::unique_ptr<cvVolumeFace> controlVolume::matchingFace(cvVolumeFace &neighboursFace) {
  for (auto face : volumeFaces) {
    if ((face.getNeighbour() == neighboursFace.getNeighbour()) &&
        (face.getArea() - neighboursFace.getArea() < face.matchTolerence())) {      
      std::cout << "Matched faces for " << face.getNeighbour() << " and " << neighboursFace.getNeighbour();
      std::unique_ptr<cvVolumeFace> pFace(&face);
      return pFace;
    }
  }
  std::cout << "ERROR: No matching face to return!\n";
  return nullptr;
};

Разрыв происходит в памяти.h на линии 116

void _Decref()
    {   // decrement use count
    if (_MT_DECR(_Mtx, _Uses) == 0)  //<-breaks here
        {   // destroy managed resource, decrement weak reference count
        _Destroy();
        _Decwref();
        }
    }
  • 1
    0xCCCCCCD0 - это магическое число. Это означает, что вы используете неинициализированную переменную.
  • 2
    Каков тип возвращаемого значения matchFace ()? Если вызов matchFace (face) не выделяет память, вы не должны использовать std :: unique_ptr. Если matchFace просто возвращает указатель из структуры данных, вы кодируете циклически и удаляете объекты из других структур данных.
Показать ещё 6 комментариев
Теги:
c++11
visual-studio-2013
smart-pointers
unique-ptr

2 ответа

2
Лучший ответ

Имейте в виду, что pFace2 уничтожается в конце блока if (pNeighbourVolume != domain.end()) {... }, и поэтому он попытается удалить его ресурс; ресурс, который в этом случае представляется локальным объектом.

  • 0
    Это как делать int x; delete &x; - вы удаляете что-то, что не было выделено динамически с соответствующим новым выражением .. акцент на не выделено динамически ..
0

Умные указатели не являются оправданием, чтобы не думать о времени жизни объекта в вашем дизайне. std::unique_ptr - очень хороший способ контролировать время жизни объекта, принадлежащего другому объекту, или в ограниченной области. Как правило, такой unique_ptr не должен передаваться - гораздо лучше просто сохранить право собственности на всю жизнь владельца этого unique_ptr и передавать необработанные указатели другим пользователям, которые никогда не должны пытаться взять на себя ответственность. С другой стороны, если время жизни различных аксессуаров объекта неопределенно, то, возможно, следует рассмотреть std::shared_ptr. Это более мощная абстракция с поддержкой слабых ссылок и т.д., Но она также довольно дорогая, поскольку она включает отдельно выделенный блок управления и пару атомных опорных счетчиков.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню