c++ 是什么措辞使得`T`的构造函数中的`std::vector< T>::clear()`的双重释放导致调用成为未定义行为?

shyt4zoc  于 2023-05-02  发布在  其他
关注(0)|答案(1)|浏览(104)

下面是一个例子:

#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_backFoo(int)调用Foo(int)emplace_back完成之前调用v.clear() *。看起来,std::vector对这种混乱和我的实现(Ubuntu 22.04的libstdc++)导致double free:v[0]首先被clear()销毁,然后被v的析构函数销毁。
在任何C++标准中,什么措辞使得上面的程序的行为未定义?我只是在v上调用一些操作。我甚至不访问v的任何元素。

68bkxrlz

68bkxrlz1#

有一个活跃的LWG问题2414,用于阐明调用库对象的不同成员函数时的可重入性。[可重入性]中的当前措辞仅指定哪些库函数相对于自身是可重入的是实现定义的(除非被更具体的规则否决)。

相关问题