C++ 动态内存分配详解(new/new[]和delete/delete[])
动态内存分配是指程序在运行期间根据需要动态地申请内存空间的过程,C++语言提供了new/new[]
和delete/delete[]
运算符来进行动态内存分配和释放。
动态内存分配方式
new关键字动态分配单变量内存
语法格式:
new dataType;
对于上述语句,程序在运行期间会从堆空间中申请一块大小为sizeof(dataType)
的内存空间,并根据数据类型的特点进行初始化,最后返回指向该空间首地址的指针。
示例代码如下:
#include <iostream>
int main() {
int *p = new int;
if (p == nullptr) {
std::cerr << "Failed to allocate memory" << std::endl;
return -1;
}
*p = 10;
std::cout << *p << std::endl;
delete p;
p = nullptr;
return 0;
}
程序运行结果:
10
new关键字动态分配数组内存
语法格式:
new dataType[arraySize];
对于上述语句,程序在运行期间会从堆空间中申请一块大小为sizeof(dataType) * arraySize
的内存空间,并根据数据类型的特点对其中的每个元素都进行初始化,最后返回指向该空间首地址的指针。
示例代码如下:
#include <iostream>
int main() {
int *p = new int[5];
if (p == nullptr) {
std::cerr << "Failed to allocate memory" << std::endl;
return -1;
}
for (int i = 0; i < 5; ++i) {
*(p + i) = 10 * i;
std::cout << *(p + i) << " ";
}
std::cout << std::endl;
delete[] p; // 注意:动态分配的数组需要用delete[]进行释放
p = nullptr;
return 0;
}
程序运行结果:
0 10 20 30 40
delete关键字释放动态分配的单变量内存
语法格式:
delete ptr;
对于上述语句,delete
关键字会释放指针ptr
所指向的动态内存空间,并将该指针置为nullptr
。
示例代码如下:
#include <iostream>
int main() {
int *p = new int;
if (p == nullptr) {
std::cerr << "Failed to allocate memory" << std::endl;
return -1;
}
*p = 10;
std::cout << *p << std::endl;
delete p;
p = nullptr;
std::cout << *p << std::endl; // 此处会出现错误,因为指针已经被释放
return 0;
}
delete关键字释放动态分配的数组内存
语法格式:
delete[] ptr;
对于上述语句,delete[]
关键字会释放指针ptr
所指向的动态内存空间(即动态分配的数组),并将该指针置为nullptr
。
示例代码如下:
#include <iostream>
int main() {
int *p = new int[5];
if (p == nullptr) {
std::cerr << "Failed to allocate memory" << std::endl;
return -1;
}
for (int i = 0; i < 5; ++i) {
*(p + i) = 10 * i;
std::cout << *(p + i) << " ";
}
std::cout << std::endl;
delete[] p;
p = nullptr;
std::cout << *(p + 1) << std::endl; // 此处会出现错误,因为指针已经被释放
return 0;
}
动态内存分配的应用场景
动态内存分配在以下情况下比较常见:
- 当程序无法预知需要分配多大的内存空间时,可以通过动态内存分配来获取所需空间;
- 当程序需要在函数内部创建一个较大的数组,但是又不希望在栈空间上分配该数组时,可以通过动态内存分配来避免可用栈空间不足的问题;
- 当程序要返回值为一个数组或结构体时,可以通过动态内存分配来获取该数组或结构体的内存空间,并在函数结束前将其释放。
总结
动态内存分配是C++语言中非常重要的一部分,在实际开发中需要掌握其使用方式和注意事项,避免内存泄漏和指针悬空等问题的出现。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 动态内存分配详解(new/new[]和delete/delete[]) - Python技术站