这是一个非常新手的问题,但对我来说却是全新的。在我的代码中,以及我以前见过的任何地方,新对象都是这样创建的......
MyClass x = new MyClass(factory);
但是,我刚刚看到一些示例代码,如下所示......
MyClass x(factory);
这会做同样的事情吗?
最佳答案
一点也不。
第一个示例使用动态内存分配,即,您在堆(而不是堆栈)上分配 MyClass
的实例。您需要手动对该指针调用delete
,否则最终会导致内存泄漏。另外,operator new 返回一个指针,而不是对象本身,因此您的代码将无法编译。需要改为:
MyClass* x = new MyClass(factory);
第二个示例在堆栈上分配了一个 MyClass
实例。这对于短期对象非常有用,因为当离开当前作用域时,它们会自动被清理(而且速度很快;清理堆栈只涉及递增或递减指针)。
这也是实现 Resource Acquisition is Initialization pattern 的方式,通常称为 RAII。您的类型的析构函数将清理所有动态分配的内存,因此当堆栈分配的变量超出范围时,系统会为您清理所有动态分配的内存,而无需任何外部调用delete
。
关于c++ - 新的对象变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6392918/