假定一个 double 类型的变量需要内存空间,可以定义一个指向 double* 类型的指针。再在执行程序时,请求为该变量分配内存空间。
一种方法是:
double* pvalue {};
pvalue = new double;
注意,所有的指针都应初始化。如果指针没有包含合法的地址,就应该总是让它包含 nullptr。
在上述代码中,第二行代码中的 new 运算符会返回在自由存储区给 double 变量分配的内存地址,这个地址应存储在 pvalue 指针中。接着就可以通过前面介绍的间接运算符,使用这个指针引用该变量了。
例如:
*pvalue = 3.14;
当不再需要动态分配内存的变量时,就可以使用 delete 运算符,释放它占用的内存:
delete pvalue;
delete 运算符释放了内存,但没有改变指针。
解除对悬挂指针的引用会造成严重的问题,所以应总是在释放指针指向的内存时,重新设置该指针。
如下所示:
delete pvalue;
pvalue = nullptr;
现在 pvalue 不再指向任何内容。该指针不能用于访问已释放的内存。使用包含 nullptr 的指针来存储或提取数据,这会立即终止程序。
对包含 nullptr 值的指针变量应用 delete 是安全的。这种语句不会有任何效果。因此,没有必要使用下面的 if 测试:
if (pvalue)
{
delete pvalue;
pvalue = nullptr;
}
警告:每个 new 必须对应一个 delete,每个 new[] 必须对应一个 delete[]。如果不能这样对应,就会导致不确定的行为或内存泄漏。
提示:
在日常编码中,不要直接使用 new、new[]、delete、delete[]运算符。
在现代 C++ 代码中,没有它们的立足之地。总是应该使用 std::vector<>容器(来替换或智能指针)来动态分配对象并管理其生存期。这些高级替代方法比低级的内存管理方法安全得多,可立即清除程序中的所有悬挂指针、多次释放、分配/释放不匹配和内存泄漏问题,为程序员提供巨大的帮助。