C ++动态内存最佳实践

时间:2018-03-09 16:03:44

标签: c++

我正在学习C ++,但我遇到了一些代码,我对它究竟是做什么感到困惑。我学习动态记忆,而我从中学到的地方提到这是一种很好的做法。

double * pvalue = NULL;

if(!(pvalue = new double)){
  cout<<"Error: out of memory." << endl;
  exit(1);
}

我知道你正在创建一个名为pvalue的指针,但我不理解if语句。如果有人能向我解释,我将不胜感激。

4 个答案:

答案 0 :(得分:3)

  

我对它到底发生了什么感到困惑。

使用一个非常过时的概念和对C ++的有限理解。

首先,C ++不报告通过返回NULL来分配内存失败。它抛出类型为std::bad_alloc的异常(源自std::exception)。

其次,随着C ++ 11的出现,使用&#34;裸体&#34;像这样的指针是不受欢迎的,因为当你忘记delete它们时,它们很容易导致资源泄漏,例如当意外的异常使你的指针超出范围时。

所以你使用std::shared_ptr<>unique_ptr<>

答案 1 :(得分:2)

     pvalue = new double   // This allocates a dynamic double as usual
   !(pvalue = new double)  // This takes the value of the resulting pointer
                           // and negates it, checking whether it's null
if(!(pvalue = new double)) // It all becomes the condition for the if.

值得注意的是:

  • 原始拥有指针必须在C ++中使用,而是使用智能指针;
  • using namespace std;(我确定这个样本有)不得使用;
  • 动态分配单个double 怪异;
  • 普通new从不返回空指针,因此检查毫无意义;
  • std::exit将在飞行途中对您的程序进行核对,自动生命周期中泄漏所有对象,而不是从main返回。
  

[...]我从中学到的地方提到这是一种很好的做法。

是时候戴上一些重金属和太阳镜,点燃“地方”,找一些更好的学习材料。

答案 2 :(得分:1)

此:

if(!(pvalue = new double)){

...只是一种(或许也是)聪明的简写方式:

pvalue = new double;
if (pvalue == NULL) {...}

答案 3 :(得分:1)

除非您提供std::nothrow,否则

new永远不会返回nullptr。相反,如果new失败,它将抛出std::bad_alloc

更合适的解决方案是:

#include <iostream>
#include <stdexcept>

double * foo()
{
    double * pvalue = nullptr;

    try {
        pvalue = new double;
    }
    catch(const std::bad_alloc &)   {
        std::cout << "Error: out of memory." << std::endl;
        exit(1);
    }
    return pvalue;
}

但是,在现代代码中不鼓励使用原始拥有指针。通常会避免使用new来支持std::make_uniquestd::make_shared。例如,一个更好的解决方案是这样的:

#include <iostream>
#include <memory>
#include <stdexcept>

std::unique_ptr<double> foo()
{
    try {
        return std::make_unique<double>();
    }
    catch(const std::bad_alloc &)   {
        std::cout << "Error: out of memory." << std::endl;
        exit(1);
    }
}