带字符串和bad_alloc检查的构造函数

时间:2018-06-24 11:50:48

标签: c++ string memory-management constructor exception-handling

我是C ++初学者,我正在用C ++编写类,并且正在使用void CScriptAccessible::InvokeInternal(ScriptFunction* scriptFunc, void** args) { // here I have to push params from **args** to stack // and somehow call ScriptFunction::m_func // In assembly I could see pushes to stack in a loop (driven by // ScriptFunction::m_argCount). But I'm wondering, whether it's // possible to do in C++ (push args on stack and call function by just address) } 。 如何处理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; } } 中的x.assaing(y)时,是否也需要检查std::string异常吗? (如果我想处理内存泄漏。) 我正在寻找一种没有智能指针的方法(我们还没有学过)。

2 个答案:

答案 0 :(得分:1)

通过member initializer list中的构造函数初始化类型std::string的成员不会导致内存泄漏。

#include <string>
struct Temp
{
   Temp (const std::string& name): name(name) {}
   std::string name;
};

Temp t ("yourname");
std::cout << t.name; // yourname

更新(由@Deduplicator建议)

如果仅使用一个ctor,则不妨使用std::string_view,它是:

  

char类对象的连续连续序列

赞:

#include <string_view>
struct Temp
{
   Temp (std::string_view name): name(name) {}
   std::string name;
};

Temp t ("yourname");
std::cout << t.name; // yourname

答案 1 :(得分:0)

如果字符串构造确实抛出bad_alloc,那么您几乎无能为力。您当然不应该将每个字符串构造都包装在try块中。取而代之的是,您应该允许异常上升到更高的层次,例如您的主函数,在其中捕获异常,以某种方式报告错误,并可能终止程序。通常,您希望以可以合理处理的最高级别捕获异常。