首页 \ 问答 \ std :: tr1 :: shared_ptr是否会抛出bad_alloc并且在try / catch块中是个好主意?(Does std::tr1::shared_ptr throw bad_alloc and a good idea to be in try/catch block?)

std :: tr1 :: shared_ptr是否会抛出bad_alloc并且在try / catch块中是个好主意?(Does std::tr1::shared_ptr throw bad_alloc and a good idea to be in try/catch block?)

我实际上正在制作一个简单的C ++ SFML游戏,我想更多地学习C ++编程。

现在我正在使用shared_ptr来管理资源。 在创建新资源时,我对shared_ptrs有一些疑问,例如:

    shared_ptr< Resource > resource( new Resource( World::LEVEL ) );

根据boost shared_ptr <class Y>(Y * p)抛出bad_alloc。 我不知道如果std :: tr1也是这样。 我不知道是否应该担心将shared_ptr放入try / catch块中以检查bad_alloc是否被抛出。 这是一个很好的编程习惯吗?


I am actually making a simple C++ SFML game and I want to learn much more into C++ programming.

Now I am using shared_ptr to manage resources. I have some question about shared_ptrs when creating a new resource like:

    shared_ptr< Resource > resource( new Resource( World::LEVEL ) );

According to boost shared_ptr< class Y>( Y * p ) throws bad_alloc. I dunno if std::tr1 does the same. And I do not know if I should worry about putting shared_ptr inside a try/catch block to check if bad_alloc is thrown. Is this a good programming practice?


原文:https://stackoverflow.com/questions/14109542
更新时间:2019-11-29 02:17

最满意答案

根据C ++ 2011标准§20.7.2.2.1¶6:

template<class Y> explicit shared_ptr(Y* p);

抛出: bad_alloc ,或者当无法获取内存以外的其他资源时执行定义的异常。

当你知道如何处理它们时,你会发现异常。 如果您要处理内存不足的异常并且有代码来执行此操作,那么请务必尝试一下。 如果您没有编写任务关键代码,也不希望在系统内存限制的边缘进行操作,则可能不需要。 请注意,一旦系统内存不足,几乎每行代码都会引发异常。

需要注意的是,在现代硬件/操作系统上,“内存不足”并不意味着你已经超出了物理内存的限制 - 你只能拥有128MiB的内存,即使使用了10倍的内存也不会出错,并且你可以拥有8GiB的物理内存,并且在你只使用了一半的时候就会出现这个错误。 这是指应用程序可用的内存空间,如果需要,操作系统会将其分页到磁盘(并假定可用磁盘空间)。


Per the C++ 2011 standard, §20.7.2.2.1 ¶6:

template<class Y> explicit shared_ptr(Y* p);

Throws: bad_alloc, or an implementation-defined exception when a resource other than memory could not be obtained.

You catch exceptions when you know how to handle them. If you're going to handle a out-of-memory exception and have code to do so, then by all means, put it in a try-catch. If you're not writing mission-critical code and don't expect to be operating on the edge of system memory constraints, it's likely not necessary. Note that pretty much every line of code you write can throw exceptions once your system is out of memory.

It's important to note that on modern hardware/operating systems, "out of memory" doesn't mean that you've exceeded the physical memory constraints - you can have only 128MiB of memory and not get an error even when you use 10 times that, and you can have 8GiB of physical memory and get that error when you've only used half that much. This refers to the memory space available to your application, which the OS will page to disk if necessary (and assuming available disk space).

2013-01-01

相关文章

更多

最新问答

更多
  • jsPlumb draggable element javascript函数(jsPlumb draggable element javascript function)
  • MVC4:ViewModel(带有radiobuttonlist)在HttpPost之后为空(MVC4: ViewModel (with radiobuttonlist) is empty after HttpPost)
  • 如何在同一帐户上设置“Dev repo”(在prod和团队之间)(How to set up a “Dev repo” (between the prod and the team) on the same account)
  • 如何在tcl中将eth0配置为发送方udp端口(how to configure eth0 as a sender udp port in tcl)
  • 如何在datarow []中的列中找到最大值?(How to find max value in a column in a datarow[] ?)
  • 如何使用预定义文本替换来自数据库的部分结果(How do I replace part of result coming from Database with predefined text)
  • Selenium Java注入了新的Javascript函数(Selenium Java inject new Javascript function)
  • 使用.on的多个下拉菜单选择文本仅适用于第一个下拉列表(Multiple Dropdowns Menu Selection text using .on works only on first dropdown)
  • 快速将黄土曲线添加到大型数据集图中的方法(Quick way to add loess curve to large data set graph)
  • FilteringSelect in mvc(FilteringSelect in mvc)
  • 在Delphi XE2中开发Mac或iOS应用程序需要哪些硬件/软件?(What hardware/software is necessary to develop Mac or iOS apps in Delphi XE2?)
  • 在原型的构造函数中初始化属性时获取“未定义”(Getting 'undefined' when a property is initialized in the constructor of a prototype)
  • 通过越狱加载的应用程序的Documents文件夹位置(Location of Documents folder for an app loaded via jailbreak)
  • 在OpenGL中使用可编程和固定管道功能(Using both programmable and fixed pipeline functionality in OpenGL)
  • 将任何用户输入重定向到单独的底层程序(redirect any user input to a separate underlying program)
  • 编辑文本不能正常工作android(Edit texts not working properly android)
  • “user_denied”Facebook应用页面上的Facebook用户区域设置(Facebook user locale on “user_denied” facebook app page)
  • 在大图像中找到小的部分透明图像的坐标(find coordinates of small partially-transparent image within a large image)
  • 我如何在cakephp 3.1中获得完整的相对路径?(How i can get full relative path of image in cakephp 3.1?)
  • 如何保存拖动标记的新本地化?(How to save new localization of dragged marker?)
  • MySQL UPDATE vs INSERT和DELETE(MySQL UPDATE vs INSERT and DELETE)
  • 在执行查询之前,在SQLAlchemy模型中将datetime转换为unix时间戳?(Convert datetime to unix timestamp in SQLAlchemy model before executing query?)
  • OpenCL与OpenGL互操作的优势(Advantage of OpenCL interoperability with OpenGL)
  • 如何解析用点和等分隔的数据然后添加到listview(How to parsing data from delimited with dot and equal then add to listview)
  • 带调试输出的X3解析器段错误(BOOST_SPIRIT_X3_DEBUG)(X3 parser segfaults with debug output (BOOST_SPIRIT_X3_DEBUG))
  • 将文件夹名称添加到fgrep结果(Add folder name to fgrep result)
  • 在MySQL中加载一个表是非常慢的(Loading one table in MySQL is ridiculously slow)
  • 如何将JSON放入PHP变量?(How do I put JSON into a PHP Variable?)
  • 如何绕过Microsoft.Speech.Recognition中的不流畅?(How to bypass disfluencies in Microsoft.Speech.Recognition?)
  • 原点的最后一行是什么?(What is the last row of an origin for?)