gpt4 book ai didi

c++ - 如果在分配过程中抛出异常怎么办?

转载 作者:太空宇宙 更新时间:2023-11-04 14:53:54 25 4
gpt4 key购买 nike

我有以下函数模板:

template<typename T>
void init(std::vector<T>& v, int min, int max)
{
for(int i = min; i <= max; i++)
v.push_back(new T());
}

它将使用另一个函数,如下所示:

void foo()
{
std::vector v;
init(v, 10, 20);
//something else
}

如果在函数 init 中初始化某些类型为 T 的对象时抛出异常,会发生什么情况?

在这种情况下我会发生内存泄漏还是其他类型的 UB?如果是这样,我该如何预防?

最佳答案

如果内存分配失败,你会得到std::bad_alloc异常(exception)。如果在类型 T 的构造执行过程中出现异常,则应在类型 T 的构造函数中使用 try catch block 处理。

如果std::vector::push_back使用 new 创建对象后失败运算符,可能会发生内存泄漏,因为新生成的原始指针还不是 vector 的一部分。由于您正在创建使用 new 生成的原始指针的 vector 接线员,您应该调用 delete在 vector 的内容上作为适当清理的一部分。 std::vector<>析构函数只清除指针,不清除 T 类型的对象。

要解决此原始指针问题,您可以依赖 std::shared_ptrstd::unique_ptr如果你有 C++11 编译器,代替原始指针

关于c++ - 如果在分配过程中抛出异常怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31275692/

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