gpt4 book ai didi

c++ - 空 std::list 在调用析构函数时抛出异常

转载 作者:行者123 更新时间:2023-11-30 02:46:11 27 4
gpt4 key购买 nike

所以如果我在程序退出时使用下面的代码,我会在这个位置的 std::list 中得到一个异常。这与我是否向其中添加项目无关。

 void clear() _NOEXCEPT
{ // erase all
#if _ITERATOR_DEBUG_LEVEL == 2
this->_Orphan_ptr(*this, nullptr);
#endif /* _ITERATOR_DEBUG_LEVEL == 2 */

_Nodeptr _Pnode = this->_Nextnode(this->_Myhead);
this->_Nextnode(this->_Myhead) = this->_Myhead;
this->_Prevnode(this->_Myhead) = this->_Myhead;
this->_Mysize = 0;

for (_Nodeptr _Pnext; _Pnode != this->_Myhead; _Pnode = _Pnext)
{ // delete an element
_Pnext = this->_Nextnode(_Pnode); //Unhandled exception, access violation
this->_Freenode(_Pnode);
}
}

这是我目前使用 std::list 的唯一容器,我只有其中的一个......如果我将 std::list 切换为 std::vector 那么它工作正常。

#pragma once
#ifndef EVENT_H
#define EVENT_H
#include <delegate.h>
#include <list>
#include <vector>

using fd::delegate;

template<typename... Args>
class Event;

template<typename...Args>
class Event<void(Args...)>
{
private:
std::list<delegate<void(Args...)>> m_delegates;
public:
void addListener(const delegate<void(Args...)>& d)
{
if (d)
m_delegates.push_back(d);
}

void removeListener(const delegate<void(Args...)>& d)
{
if (d)
m_delegates.remove(d);
}

void removeDeadListeners()
{
for (auto i = m_delegates.begin(); i != m_delegates.end(); i++)
{
if (i->empty())
m_delegates.remove(i);
}
}

void operator()(Args... args)
{
for (auto& d : m_delegates)
{
d(args...);
}
}
};

#endif //EVENT_H

有什么方法可以使用 std::list 吗?

最佳答案

我认为您的问题是您在遍历 list 时从中删除项目,但令我惊讶的是您显示的代码完全可以编译。

for (auto i = m_delegates.begin(); i != m_delegates.end(); i++)
{
if (i->empty())
m_delegates.remove(i); // <-- This shouldn't compile
}

list::removelist::value_type 作为参数,而不是 list::iterator,因此上面的代码应该无法编译。解决方案是使用 list::erase

for (auto i = m_delegates.begin(); i != m_delegates.end(); )
{
if (i->empty())
i = m_delegates.erase(i); // get iterator to next element
else
++i;
}

您也可以完全消除循环并使用 list::remove_if

m_delegates.remove_if([](decltype(m_delegates)::value_type const& elem) {
return elem.empty();
});

关于c++ - 空 std::list 在调用析构函数时抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23795817/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com