解除"新"指针被认为是好的风格吗?

mch*_*hen 14 c++ pointers new-operator dereference

为了避免继续使用->而是直接使用对象,可以接受的做法是:

obj x = *(new obj(...));
...
delete &obj;
Run Code Online (Sandbox Code Playgroud)

And*_*owl 29

这不仅仅是糟糕的做法,而是:

  1. 泄漏内存(很可能,除非您使用的是从您提供的代码中看不到的某些模式),因为obj它将存储由表达式创建的原始对象的副本new,并且返回的对象的指针将new丢失;
  2. 最重要的是,未定义的行为,因为您传递给delete指向未分配的对象的指针new.根据C++ 11标准的5.3.5/2段:

[...]在第一个替代(删除对象)中,delete的操作数的值可以是空指针值,指向由前一个new-expression创建的非数组对象的指针,或指向子对象的指针(1.8)代表这种对象的基类(第10条).如果不是,则行为未定义.


Luc*_*ore 9

不,实际上这会导致泄漏.x复制初始化,因此指向的原始对象new obj丢失.

只是用

obj x(...);
Run Code Online (Sandbox Code Playgroud)

无需动态分配.要么

obj x = obj(...);
Run Code Online (Sandbox Code Playgroud)

如果你必须(怀疑).

  • @Marcin是的,你可以.您也可以将键盘粉碎到屏幕上.只因为你可以,并不意味着你应该.:) (4认同)
  • 或者你可以使用引用`obj&=(*new ...` (3认同)

Mik*_*our 7

当然不是; 将动态对象复制到自动变量,丢失指向它的唯一指针,然后尝试删除自动副本.您有内存泄漏和无效删除.

更好的方法是首先使用自动变量:

obj x(...);
...
// no need to delete anything
Run Code Online (Sandbox Code Playgroud)

或者,如果由于某种原因它真的必须是动态的(因为它对于堆栈来说太大了,或者你并不总是想在这里销毁它),那么使用智能指针和引用如果你真的不喜欢 ->

std::unique_ptr<obj> p(new obj(...));
obj & x = *p;
...
// still no need to delete anything
Run Code Online (Sandbox Code Playgroud)

将您x转换为引用将是有效的(只要您小心异常,早期函数返回等不会导致泄漏),但会导致任何不幸的人不得不维持它的混乱.