为什么VS2013在销毁唯一指针时抛出异常?

时间:2014-11-14 19:58:50

标签: c++ c++11 visual-studio-2013 smart-pointers unique-ptr

你能否提供一些关于这个异常意味着什么以及为什么只在unique_ptr被抛出时才会被抛出的信息!= nullptr?

代码编译并运行抛出异常。

唯一指针pFace2似乎在被销毁时抛出异常 当它== nullptr时,它不会抛出异常。

VS2013例外信息是:

  

Network.exe中0x00CA6A0C的第一次机会异常: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;
};

在第116行的memory.h中发生中断

void _Decref()
    {   // decrement use count
    if (_MT_DECR(_Mtx, _Uses) == 0)  //<-breaks here
        {   // destroy managed resource, decrement weak reference count
        _Destroy();
        _Decwref();
        }
    }

2 个答案:

答案 0 :(得分:2)

请记住,在pFace2块的末尾会销毁if (pNeighbourVolume != domain.end()) { ... },因此会尝试删除其资源;在这种情况下,资源似乎是本地对象。

答案 1 :(得分:-1)

智能指针并不是不考虑设计中对象生命周期的借口。 std::unique_ptr是控制另一个对象拥有的对象的生命周期或在有限范围内的非常好的方法。通常不应该传递这样的unique_ptr - 更好的方法是只使用unique_ptr所有者的生命周期维护所有权,并将原始指针传递给其他用户,谁永远不应该尝试取得所有权。另一方面,如果对象的各种访问器的生命周期不确定,那么可能应该考虑std::shared_ptr。这是一个更强大的抽象,完全支持弱引用等,但它也相当昂贵,因为它涉及一个单独分配的控制块和几个原子引用计数器。