下面是一个例子:
#include <string>
#include <vector>
struct Foo;
std::vector<Foo> v;
struct Foo {
std::string s = std::string(10000, 'x');
Foo() {}
Foo(int) { v.clear(); }
};
int main() {
v.resize(1); // required, otherwise no double free
v.reserve(2); // optional
v.emplace_back(10); // causes double free
}
这里我调用v.emplace_back
,Foo(int)
调用Foo(int)
,emplace_back
完成之前调用v.clear()
*。看起来,std::vector
对这种混乱和我的实现(Ubuntu 22.04的libstdc++)导致double free:v[0]
首先被clear()
销毁,然后被v
的析构函数销毁。
在任何C++标准中,什么措辞使得上面的程序的行为未定义?我只是在v
上调用一些操作。我甚至不访问v
的任何元素。
1条答案
按热度按时间68bkxrlz1#
有一个活跃的LWG问题2414,用于阐明调用库对象的不同成员函数时的可重入性。[可重入性]中的当前措辞仅指定哪些库函数相对于自身是可重入的是实现定义的(除非被更具体的规则否决)。