gpt4 book ai didi

c++ - 从 TC++PL 书中的练习中定位 vector ctor 中的错误

转载 作者:太空狗 更新时间:2023-10-29 23:18:52 26 4
gpt4 key购买 nike

我一直在做 Bjarne Stroustrup 的“C++ 编程语言”一书中的所有练习。

我完成了一个特定的练习(E.8.4) 这让我难住了。
这是讨论标准库类中异常安全的附录。他说明了 vector 构造函数的一种可能实现,然后要求读者找出错误。提示表明它有一些东西处理析构函数(也许以某种方式双重释放?)但我只是没有看到他在追求什么。

据我所知,分配器可能会抛出 bad_alloc,从而终止 ctor。类似地,T 上的复制构造函数可以在 uninitialized_fill 内部抛出,这将破坏任何先前复制的元素并终止构造函数。如果那里有错误,对我来说并不明显。

练习的措辞如下:“在 vector 的构造函数 (E.3.1) 的‘困惑’版本中找到错误,并编写程序使其崩溃。提示:首先实现 vector 的析构函数。

这只是一个 1 分的练习,所以我一定漏掉了一些非常明显的东西。我认为它与析构函数抛出无关,因为在那种情况下所有赌注都没有了。也许维护“空间”和“最后”字段的不变量存在问题?

我很想听听任何人的想法。

相关代码如下:

template<class T, class A = std::allocator<T> >
class vector {
private:
T* v;
T* space;
T* last;
A alloc;

void destroy_all();
public:
typedef size_t size_type;

explicit vector(size_type n, const T& val = T(), const A& = A());
vector(const vector& a);
vector& operator=(const vector& a);
~vector() { destroy_all(); alloc.deallocate(v, last-v); }
size_type size() const { return space-v; }
size_type capacity() const { return last-v; }
void push_back(const T&);
};

template<class T, class A>
void vector<T,A>::destroy_all() {
for(T* p = v; p != last; p++)
alloc.destroy(p);
}

template<class T, class A>
vector<T,A>::vector(size_type n, const T& val, const A& a) : alloc(a) {
v = alloc.allocate(n);
try {
std::uninitialized_fill(v, v + n, val);
space = last = v + n;
}
catch(...) {
alloc.deallocate(v, n);
throw;
}
}

最佳答案

问题是 T 的构造函数可以抛出,这意味着它可以抛出:

std::uninitialized_fill(v, v + n, val);

发生这种情况时,catch(...) 子句会释放内存,而不会正确销毁可能已经构造的任何 T 对象。

关于c++ - 从 TC++PL 书中的练习中定位 vector ctor 中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12273184/

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