Law*_*llo 4 c++ if-statement new-operator
大家好抱歉.我的意思是在我发布的代码中有一个星号.请再次回答.
我正在为同事做代码审查,我看到弹出如下语句:
if ((someClass *object1 = new someClass))
{
// Do work
}
Run Code Online (Sandbox Code Playgroud)
这句话是否与以下内容相同?
someClass *object1 = new someClass;
if (object1)
{
// Do work
}
Run Code Online (Sandbox Code Playgroud)
我只是想看看它们是否相同所以我们不会得到任何错误.
if除非类型直接出现在括号内,否则无法在第一种形式的条件内创建对象,因此:
if (someClass* object1 = new Someclass(...)) { ... }
Run Code Online (Sandbox Code Playgroud)
或者,一般情况下:
if (someType object1 = whatever) { ... }
if (someType object1{...constructor args}) { ... }
Run Code Online (Sandbox Code Playgroud)
除了语法细节 - 主要区别在于上面的表单使用if范围来控制
该object1 变量的生命周期 -析构函数将被调用时if终止(如果你的变量控制的资源,这可能是重要的,但指针没有析构函数无论如何所以你需要确保你打电话delete的前if范围完成-你可以考虑使用智能指针),和
的object1标识符本身,它可以在封闭范围自由地用于一些其他无关的变量.
在第二种形式中,变量保留在范围之后if的范围内,并且标识符在它所在的范围结束之前不能重复使用.
行为的默认值new是,如果它不能返回指向新分配的内存的指针,则抛出异常,因此if在这种情况下只会跳过该语句,使代码等效于:
...
{
someClass* object1 = new SomeClass;
// other if content is effectively in a scope here
// to avoid a leak, must either:
- delete object1;
- copy/save the pointer somewhere to delete later
}
...
Run Code Online (Sandbox Code Playgroud)