1、容易造成内存泄漏
使用 new
分配内存后,如果忘记使用 delete
释放,就会导致内存泄漏。程序复杂后难以保证每个 new
都能对应一个 delete
。
#include<iostream>
using namespace std;
void memoryLeakExample() {
// 动态分配内存,并初始化为 10
int* ptr = new int(10);
std::cout << "值: " << *ptr << std::endl;
// 忘记 delete ptr; 这里会导致内存泄漏
// 正确写法应为:delete ptr;
}
int main() {
memoryLeakExample();
return 0;
}
2、异常安全性差
如果在 new
后发生异常,中间变量可能没有释放,从而造成资源泄露。
#include <iostream>
#include <stdexcept>
void func() {
int* ptr = new int(42);
throw std::runtime_error("error"); // 内存泄漏:ptr 没有 delete
}
int main() {
try {
func();
} catch (const std::runtime_error& e) {
std::cerr << "Caught exception: " << e.what() << std::endl;
}
return 0;
}
3、难以管理生命周期
手动管理内存生命周期不易维护和调试。特别在多线程或复杂逻辑中,容易出现野指针、悬垂指针。
#include <iostream>
class Data {
public:
Data(int v) : value(v) {
std::cout << "Data created\n";
}
~Data() {
std::cout << "Data destroyed\n";
}
void show() const {
std::cout << "Value: " << value << std::endl;
}
private:
int value;
};
void process(Data* d) {
d->show(); // 使用外部传入的指针
}
int main() {
Data* ptr = new Data(10);
delete ptr; // 显式释放
process(ptr); // ❌ 悬挂指针!访问已释放内存
return 0;
}
4、现代 C++ 提供更安全的替代品
使用智能指针(如 std::unique_ptr
, std::shared_ptr
)更安全,自动释放内存。使用容器(如 std::vector
, std::string
)可以避免裸指针操作。
#include <iostream>
#include <memory> // 包含 std::make_unique 和 std::unique_ptr
int main() {
// 创建一个指向 int 的 unique_ptr,初始化为 42
auto ptr = std::make_unique<int>(42);
// 访问并打印指针指向的值
std::cout << "Value: " << *ptr << std::endl;
// 不需要手动 delete,ptr 离开作用域时会自动释放内存
return 0;
}
5、可能影响程序性能
new
/delete
比栈内存或智能指针操作开销更大。尤其是在频繁分配/释放内存时,可能影响性能和缓存局部性。