我正在学习C ++,但我遇到了一些代码,我对它究竟是做什么感到困惑。我学习动态记忆,而我从中学到的地方提到这是一种很好的做法。
double * pvalue = NULL;
if(!(pvalue = new double)){
cout<<"Error: out of memory." << endl;
exit(1);
}
我知道你正在创建一个名为pvalue的指针,但我不理解if语句。如果有人能向我解释,我将不胜感激。
答案 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.
值得注意的是:
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_unique
或std::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);
}
}