new
是 C++ 中的一个运算符,用于动态分配内存。当使用 new
运算符时,会在堆上分配内存,并返回指向该内存的指针。与 C 语言中的 malloc
函数类似,但 new
提供了类型安全,并且会自动调用对象的构造函数。
new
运算符返回正确的类型指针,不需要进行类型转换。new
运算符会自动调用对象的构造函数,确保对象被正确初始化。new
运算符会抛出 std::bad_alloc
异常,而不是返回一个空指针。new
运算符有多种形式:
new
运算符广泛应用于动态内存分配的场景,例如:
原因:当系统内存不足时,new
运算符可能无法分配所需的内存。
解决方法:
nothrow
版本:nothrow
版本:std::unique_ptr
和 std::shared_ptr
)来自动管理内存。原因:如果分配的内存没有被正确释放,会导致内存泄漏。
解决方法:
#include <iostream>
#include <new>
#include <memory>
class MyClass {
public:
MyClass() {
std::cout << "MyClass constructor called" << std::endl;
}
~MyClass() {
std::cout << "MyClass destructor called" << std::endl;
}
};
int main() {
try {
// 基本形式
int* p = new int;
delete p;
// 带初始值的形式
int* p2 = new int(10);
delete p2;
// 数组形式
int* arr = new int[10];
delete[] arr;
// 定位形式
int* p3 = new (std::nothrow) int;
if (!p3) {
std::cerr << "Memory allocation failed" << std::endl;
} else {
delete p3;
}
// 使用智能指针
std::unique_ptr<int> p4(new int(20));
// 不需要手动释放内存
// 创建对象
std::unique_ptr<MyClass> obj(new MyClass());
// 不需要手动释放内存
} catch (const std::bad_alloc& e) {
std::cerr << "Memory allocation failed: " << e.what() << '\n';
}
return 0;
}
领取专属 10元无门槛券
手把手带您无忧上云