-
new
、delete
运算符一次分配
、释放
一个对象。
// new一个数组对象,数组长度size为整型
int *p = new int[size];
-
new T[]
动态分配一个数组,会得到一个(T*)
指针类型的元素 - 初始化动态分配对象的数组
#include <bits/stdc++.h>
using namespace std;
int main(int argc, char const *argv[])
{
cout << "5个未初始化的int元素:" << endl;
int* p = new int[5];
for(int i = 0; i < 5; ++i) {
cout << p[i] << endl; // 随机值
}
cout << "==================" << endl;
cout << "5个全为0的int元素:" << endl;
int* q = new int[5]();
for (int i = 0; i < 5; ++i)
{
cout << q[i] << endl;
}
cout << "================" << endl;
cout << "5个空string元素:" << endl;
string* ps = new string[5];
// 由于ps是指针对象,会默认调用string类的构造函数进行初始化
for (int i = 0; i < 5; ++i)
{
cout << ps[i] << endl;
}
cout << "5个空string元素:" << endl;
string* qs = new string[5]();
for (int i = 0; i < 5; ++i)
{
cout << qs[i] << endl;
}
return 0;
}

-
从实践结果来看,new一个数组且后面没有添加圆括号,若不是创建一个类对象数组,其数组中元素值是一些随机值。而实际应用中我们需要对其初始化,方法是在方括号之后加
一对空括号
。 -
在C++11中,可提供一个元素初始化器的
花括号列表
,如:
int* p = new int[5]{0, 1, 2, 3, 4};
string* ws = new string[5]{"a", "b", "c"};
- 若列表中的个数小于实际元素数目,剩余的值进行值初始化。
- 若列表中的个数大于实际元素数目,则new失败,不会分配任何内存。
- 释放一个类对象或动态数组
delete p; //p必须指向一个动态分配的对象地址(或空)
delete [] p; //p必须指向一个动态分配的数组首地址(或空)
- 若在delete一个指向数组的指针时忽略了方括号(或在delete一个指向单一对象的指针时使用了方括号),其行为是
未定义的
。 - 数组中的元素
按逆序销毁
。
网友评论