C++20
代码必须是C20,因为我用C20写了一些模板。没有C++20
,没有编译。与VS 2022比较,在调试配置中发生。在发布配置中不发生。没有调试器,它仍然发生。
引发异常,其中:
_CONSTEXPR20 void _Orphan_range_unlocked(pointer _First, pointer _Last) const {
_Iterator_base12** _Pnext = &_Mypair._Myval2._Myproxy->_Myfirstiter;
while (*_Pnext) {
-----------^^^^^^^
const auto _Pnextptr = static_cast<const_iterator&>(**_Pnext)._Ptr;
if (_Pnextptr < _First || _Last < _Pnextptr) { // skip the iterator
const auto _Temp = *_Pnext; // TRANSITION, VSO-1269037
_Pnext = &_Temp->_Mynextiter;
} else { // orphan the iterator
const auto _Temp = *_Pnext; // TRANSITION, VSO-1269037
_Temp->_Myproxy = nullptr;
*_Pnext = _Temp->_Mynextiter;
}
}
}
其中_Mypair._Myval2._Myproxy is nullptr
弹出窗口显示:
Unhandled exception thrown: read access violation.
_Pnext was 0x8.
我的密码是:
一个二个一个一个
在我看来,reserve
函数不重要。然而,即使我调整了代码,我还是遇到了这个问题:只是让this->imgs[*]
的构造函数什么都不做。this->imgs
在保留之前是空的。不知道怎么会发生这种情况。我记得很久以前我用Vulkan API写过这样的代码,它遇到了同样的问题。
我知道我可以完全删除保留区,一切正常。但我想知道为什么这段代码与Vulkan API不兼容,并且通常与交换链相关。我不能在简单的情况下表示这一点,例如std::vector<int>;
// LMAO I texted ';'而不是'.',不错!
1条答案
按热度按时间to94eoyn1#
我发现问题了,是因为我提前调用了析构函数,向量销毁后直接重用,不调用reserve也没问题,谢谢PaulMcKenzie的点评,我会修改代码,避免在使用前调用vector::~vector。