【发布时间】:2018-12-03 05:07:39
【问题描述】:
我是一名 C++ 初学者,我正在用 C++ 编写一个课程,我正在使用std::string。
如何处理bad_alloc 异常?
我能做到吗:
Temp::Temp(const string name) :
{
try {
name(name);
}
catch(std::bad_alloc& a) {
cout << "bad alloc error" << endl;
}
}
或者我应该这样做
Temp::Temp(const string name) :
name(name)
{
catch(std::bad_alloc& a) {
cout << "bad alloc error" << endl;
}
}
我想捕获异常,以便能够防止内存泄漏,然后可能会再次抛出它。
另外,当我从std::string 使用x.assaing(y) 时,我是否也必须检查bad_alloc 异常? (如果我想处理内存泄漏。)
我正在寻找一种没有智能指针的方法(我们还没有学过)。
【问题讨论】:
-
只是:
Temp::Temp(const string name) : name(name) { } -
贴出来的代码不会有内存泄漏。
-
您通常会在
main中捕获bad_alloc,打印一条消息并退出。通过捕获异常来处理内存泄漏,不如通过编写异常安全代码来处理。像Temp::Temp(const string & name) : name(name) {}这样的简单代码是异常安全的,不需要做任何额外的事情。 -
我想添加更多字段并在另一个类中创建一个临时数组,所以如果分配失败我想打印一条消息或者抛出一个不同的异常来清除数组(如果可能的话-我不想在其他类中捕获 bad_alloc)
-
@M.ams - 如果您得到
bad_alloc,那是因为无法分配内存。所以没什么可泄露的。 :-) 如果您创建一个字符串数组(或vector),中途出现异常将使编译器恢复所有内容,并且那里也没有泄漏。因此,请阅读异常安全保证,不要太努力地手动执行操作。 :-)
标签: c++ string memory-management constructor exception-handling