“栈对象”和“堆对象”这样的称呼在正式文档中比较少见,它们通常被用于非正式的讨论中。以下是一些更标准的表述方式:
### 对象(不带指针):
- **自动存储期对象(Automatic storage duration object)**:指的是对象的生命周期由其作用域决定,一旦超出作用域,对象会自动销毁。
- **局部对象(Local object)**:如果对象是在函数的局部作用域内创建的,则可以被称为局部对象。### 对象指针(指向动态分配的对象):
- **动态分配对象(Dynamically allocated object)**:通过使用`new`(或在C语言中`malloc`)运算符在堆上分配,通常与手动内存管理相关,需要使用`delete`(或`free`)运算符来释放。
- **堆分配对象(Heap-allocated object)**:与动态分配对象同义,强调对象是在程序的堆部分存储的。### 内存管理视角:
- **裸指针(Raw pointer)**:一个普通的指针变量,指向动态分配的内存,推荐用以下方法代替。
- **智能指针(Smart pointer)**:如`std::unique_ptr`、`std::shared_ptr`和`std::weak_ptr`,这些在C++11以后引入的类型提供了更安全的堆内存管理。所以,在讨论C++中的对象分配方式时,以下使用方式更准确和正式:
- 对于局部作用域内声明的对象,你可以称之为"自动存储期对象"或"局部对象"。
- 对于通过`new`操作符动态创建的对象,你可以称之为"动态分配的对象"或"堆分配对象"。
- 而对于那些要记得手动删除的指针,使用"裸指针"描述。对于使用了现代C++内存管理的情况,使用"智能指针"来描述。举例来说:
```cpp
MyClass instance; // 自动存储期对象或局部对象
MyClass* ptr = new MyClass(); // 动态分配的对象,需由裸指针管理std::unique_ptr<MyClass> smartPtr = std::make_unique<MyClass>(); // 利用智能指针管理堆分配对象
```在现代C++编程实践中,推荐使用智能指针来避免手动管理内存的工作,从而降低内存泄露和其他内存错误的风险。