Можете ли вы дать представление о том, что означает это исключение, и почему оно вызывается только тогда, когда 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();
}
}
Имейте в виду, что pFace2
уничтожается в конце блока if (pNeighbourVolume != domain.end()) {... }
, и поэтому он попытается удалить его ресурс; ресурс, который в этом случае представляется локальным объектом.
int x; delete &x;
- вы удаляете что-то, что не было выделено динамически с соответствующим новым выражением .. акцент на не выделено динамически ..
Умные указатели не являются оправданием, чтобы не думать о времени жизни объекта в вашем дизайне. std::unique_ptr
- очень хороший способ контролировать время жизни объекта, принадлежащего другому объекту, или в ограниченной области. Как правило, такой unique_ptr
не должен передаваться - гораздо лучше просто сохранить право собственности на всю жизнь владельца этого unique_ptr
и передавать необработанные указатели другим пользователям, которые никогда не должны пытаться взять на себя ответственность. С другой стороны, если время жизни различных аксессуаров объекта неопределенно, то, возможно, следует рассмотреть std::shared_ptr
. Это более мощная абстракция с поддержкой слабых ссылок и т.д., Но она также довольно дорогая, поскольку она включает отдельно выделенный блок управления и пару атомных опорных счетчиков.