c++ vector::reserve在使用Vulkan API时遇到读取访问冲突

tf7tbtn2  于 2022-12-15  发布在  其他
关注(0)|答案(1)|浏览(303)

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 ';'而不是'.',不错!

to94eoyn

to94eoyn1#

我发现问题了,是因为我提前调用了析构函数,向量销毁后直接重用,不调用reserve也没问题,谢谢PaulMcKenzie的点评,我会修改代码,避免在使用前调用vector::~vector。

相关问题