1. 初始化为 nullptr
- 策略:在声明指针时,将其初始化为
nullptr
。nullptr
是 C++11 引入的关键字,用于表示空指针,它能明确指出指针不指向任何有效的对象。
- 适用场景:适用于所有指针声明场景,特别是当暂时不确定指针要指向何处时。比如在类的成员指针声明时,在构造函数中还未对其进行有效赋值前,可先初始化为
nullptr
。例如:
class Example {
private:
int* ptr;
public:
Example() : ptr(nullptr) {}
};
2. 初始化指向栈上分配的对象
- 策略:使用栈上定义的变量地址来初始化指针。例如,定义一个局部变量,然后让指针指向它。
- 适用场景:当需要指针指向一个在函数局部作用域内有效的对象,且生命周期与函数调用相关时适用。比如在一个函数内部,需要临时操作一个对象,通过指针来访问它。例如:
void func() {
int num = 10;
int* ptr = #
// 对 ptr 指向的对象进行操作
}
3. 初始化指向堆上分配的对象(使用 new
运算符)
- 策略:使用
new
运算符在堆上分配内存,并将返回的地址赋值给指针。
- 适用场景:当需要动态分配内存,且对象的生命周期需要手动管理(通过
delete
释放)时使用。比如在实现一些动态数据结构,如链表、树等,节点通常在堆上分配。例如:
int* ptr = new int(20);
// 使用完后记得释放内存
delete ptr;
4. 使用智能指针
- 策略:
std::unique_ptr
:采用独占式所有权语义,当 std::unique_ptr
离开其作用域时,会自动释放其所指向的对象。例如:std::unique_ptr<int> ptr(new int(30));
std::shared_ptr
:采用引用计数机制,多个 std::shared_ptr
可以指向同一个对象,当引用计数为 0 时,对象自动被释放。例如:std::shared_ptr<int> ptr1 = std::make_shared<int>(40);
std::weak_ptr
:它是一种弱引用,指向由 std::shared_ptr
管理的对象,但不影响对象的引用计数。常用于解决 std::shared_ptr
的循环引用问题。例如:
std::shared_ptr<int> ptr2 = std::make_shared<int>(50);
std::weak_ptr<int> weakPtr = ptr2;
- 适用场景:
std::unique_ptr
:适用于需要明确单个对象所有权的场景,如函数返回一个动态分配的对象,且调用者负责对象的生命周期。
std::shared_ptr
:适用于多个地方可能需要访问同一个动态分配对象的场景,且对象的生命周期由所有引用它的 std::shared_ptr
共同管理。
std::weak_ptr
:适用于需要检测对象是否存在,但又不想影响其生命周期的场景,如在缓存系统中,避免循环引用导致内存泄漏。