这个问题可能是重复的.我一直在网上寻找这个想法,但我找不到任何东西.'new'和'*new'有什么区别?:
int main()
{
class Cat
{
//Code
}
new Cat();
*new Cat();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Jos*_*eld 16
这些不是两件事.没有a new和a *new.第二个是简单地将一元*应用于结果new Cat().
new Cat()是一个新表达.它动态分配和初始化一个Cat对象,并计算指向该对象的指针.如果然后将unary *应用于该指针,则取消引用它以获取该Cat对象.
通常没有理由将一元一元*立即应用于新表达式.原因是因为你立即跟踪指针并且没有将指针存储在任何地方.考虑一下你是否这样做了:
Cat c = *new Cat();
Run Code Online (Sandbox Code Playgroud)
这将导致无法恢复的内存泄漏.甲Cat对象是动态分配的,然后复制到c.动态分配Cat现在徘徊,你没有指向它的指针,你可以通过它指向delete对象.这真是太糟了.
Cat& c = *new Cat();
Run Code Online (Sandbox Code Playgroud)
这有点好,因为至少现在c只是对动态分配对象的引用.你总是delete &c;可以破坏对象.但是,它掩盖了Cat动态分配的事实.如果我正在阅读此代码,我不希望c引用动态分配的对象.
您必须记住销毁动态分配的对象.取消引用new-expression的结果会使其更难实现,因此请避免使用它.
And*_*owl 12
这个表达式:
new Cat();
Run Code Online (Sandbox Code Playgroud)
动态创建一个类型的对象Cat,你忽略了返回的指针(不存储它,不解除引用,什么都没有).这个表达式:
*new Cat();
Run Code Online (Sandbox Code Playgroud)
与上面的相同,除了您还取消引用返回的指针new.但是取消引用指针本身就是一种没有副作用的操作.
因此,具体地说,两种表达的效果是相同的.重要的一点是,通过丢失一个且仅引用您动态创建的对象来泄漏内存两次.
请记住,创建的每个对象new必须通过相应的调用来销毁delete.例如,如果以这种方式存储返回的指针:
Cat* pCat = new Cat();
Run Code Online (Sandbox Code Playgroud)
那将允许你做,稍后:
delete pCat;
Run Code Online (Sandbox Code Playgroud)
并避免内存泄漏.这个:
Cat& cat = *new Cat();
Run Code Online (Sandbox Code Playgroud)
允许你这样做,稍后:
delete &cat;
Run Code Online (Sandbox Code Playgroud)
并避免再次出现内存泄漏.但请注意,这不是一个选项:
Cat cat = *new Cat();
Run Code Online (Sandbox Code Playgroud)
以上仍然会给你一个内存泄漏.其原因是,它会复制提领返回的指针所获得的物体new进入cat.换句话说,cat与new表达式创建的对象不同(尽管相同).
new另一方面,表达式创建的对象将丢失 - 导致内存再次泄漏.
在Modern C++中,建议通过调用new和避免手动内存管理delete; 相反,请考虑使用智能指针(哪一个取决于您需要的所有权政策).例如:
#include <memory>
// ...
std::shared_ptr<Cat> pCat = std::make_shared<Cat>();
Run Code Online (Sandbox Code Playgroud)
智能指针负责在销毁指向对象的最后一个智能指针时自动销毁引用的对象.
它对你有帮助吗:
Cat *ptr = new Cat();
Cat cat = *new Cat(); /* memory leak :( */
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
444 次 |
| 最近记录: |