c++ - 使用 "throwing"构造函数避免堆分配

标签 c++

假设我有一些 Foo 类,它没有定义默认构造函数和 throws 非默认构造函数。在初始化该类型的新对象时,我想捕获任何异常并返回,否则继续使用该对象。我注意到很难(如果可能的话)在堆栈上 或通过使用共享指针来初始化此对象,因为我试图避免管理内存。

失败 1

Foo f; // doesn't work, no default constructor
try { f = Foo(...); }

失败 2

try {
  Foo f(...)
}
catch(...) {}
// doesn't work, f is inaccessible

失败 3

boost::shared_ptr<Foo> pf;
try { pf = new Foo(...); } // no assignment operator

我必须...

Foo *f;
try { f = new Foo(...) } // okay, let's just manage the memory

有办法吗?

编辑

好的,所以这有效,尽管不是最干净的。有没有更“标准”的方式?

boost::shared_ptr<Foo> pf;
try { pf = boost::shared_ptr<Foo>(new Foo(...)); }

最佳答案

智能指针有一个reset方法:

boost::shared_ptr<Foo> f;
//...
f.reset(new Foo(...));

这解决了您的“失败#3”并允许您做您想做的事。

关于c++ - 使用 "throwing"构造函数避免堆分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16860775/

相关文章:

c++ - CRC32 计算不对

c++ - Windows 8 下 Metro 风格应用程序的类似 Fraps 功能

c++ - 什么是 xtree 是 Visual C++?

php - 将 PHP 中的 $_POST 变量传递给由 exec() 函数运行的 C++ 程序

c++ - 为什么动态分配的对象无法释放?

c++ - iOS 处理强制应用程序退出的正确方法是什么

c++ - 交联 vector 中的段错误

C++ Lambdas : function that returns a function that returns a function . ..?

c++ - 在 OpenGL 中使用 for 循环创建数组

c++ - 在所有架构上 sizeof(float) 总是等于 sizeof(int) 吗?