c++ - 新的对象变体

标签 c++ class initialization new-operator

这是一个非常新手的问题,但对我来说却是全新的。在我的代码中,以及我以前见过的任何地方,新对象都是这样创建的......

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/

相关文章:

c++ - 如何将结构定义为结构的成员?

c++ - 即使存在带有结束条件的重载,带有模板参数包的递归函数也会不断调用自身

java - 当方法名与类名相同时如何实例化嵌套类?

objective-c - 将信息从 A 类委托(delegate)给 B 类再委托(delegate)给 C 类而不是直接从 A 类委托(delegate)给 C 是不是糟糕的编程设计?

c# - 静态变量初始化

c++ - 嵌套 map 是正常做法还是非常糟糕?

c++ - 调用其他文件的匿名命名空间中的函数的内联类方法

c++ - char* 类型的值不能用于初始化 "char"类型的实体

c++ - 代码 :Blocks Mingw Compiler Error: Variable-Sized Object May Not Be Initialized

C++ 获取分配节的基地址