在C++中,指针是核心概念之一,但使用时可能因语法、语义或运行时问题导致“无法使用简单指针”。以下是系统化的解析:
指针是存储内存地址的变量,通过*
声明(如int* ptr
),&
获取变量地址。直接操作指针可高效访问内存,但也易引发错误。
int* ptr; // 未初始化
*ptr = 5; // 未定义行为(UB),可能崩溃
原因:指针未指向有效内存,解引用时访问非法地址。
int* ptr = new int(10);
delete ptr; // 释放内存
*ptr = 20; // ptr仍存原地址,但内存已释放
原因:释放内存后未置空指针,导致后续操作非法。
double x = 3.14;
int* ptr = &x; // 错误:类型不兼容
原因:指针类型需与指向变量类型严格匹配(除void*
外)。
int arr[3] = {1, 2, 3};
int* ptr = arr;
*(ptr + 5) = 10; // 越界写入
原因:指针算术超出分配的内存范围。
const int* p1; // 指向常量的指针(值不可改)
int* const p2; // 指针常量(地址不可改)
误用:p1
不能修改指向的值,p2
不能重新赋值地址。
int* ptr = nullptr; // 显式初始化
if (ptr != nullptr) {
*ptr = 5; // 安全操作
}
int* ptr = new int(10);
delete ptr;
ptr = nullptr; // 释放后立即置空
#include <memory>
std::unique_ptr<int> smartPtr = std::make_unique<int>(10); // 自动管理内存
double x = 3.14;
int* ptr = reinterpret_cast<int*>(&x); // 谨慎使用类型转换
int arr[3] = {1, 2, 3};
if (index >= 0 && index < 3) {
*(arr + index) = 10; // 安全访问
}
unique_ptr
、shared_ptr
自动管理生命周期。std::vector
避免手动内存管理。#include <iostream>
#include <memory>
void safePointerExample() {
// 使用智能指针
auto ptr = std::make_unique<int>(42);
std::cout << *ptr << std::endl; // 输出42
// 传递指针到函数(只读)
const int* readPtr = ptr.get();
std::cout << *readPtr << std::endl;
} // 自动释放内存
通过规范初始化和现代C++工具,可显著降低指针错误风险。
没有搜到相关的文章