bob*_*bob 7 c++ arrays pointers memory-management dynamic-allocation
我无法理解这段代码的结尾(array = 0;):
#include <iostream>
int main()
{
std::cout << "Enter a positive integer: ";
int length;
std::cin >> length;
int *array = new int[length];
std::cout << "I just allocated an array of integers of length " << length << '\n';
array[0] = 5; // set element 0 to value 5
delete[] array; // use array delete to deallocate array
array = 0; // use nullptr instead of 0 in C++11
return 0;
}
Run Code Online (Sandbox Code Playgroud)
最后,删除动态分配的数组(返回到OS),然后分配值0.
为什么这样做?数组返回操作系统后,无需为其赋值0,对吗?
代码来自:http://www.learncpp.com/cpp-tutorial/6-9a-dynamically-allocating-arrays/
And*_*ing 14
数组返回操作系统后,无需为其赋值0,对吗?
你是对的,因为内存被运营商delete释放(解除分配),所以不需要它.但想想你可以在使用delete[]它之后在代码中的另一个地方(函数,循环等)使用指针的情况.
该array变量仍持有后的旧分配的地址delete[]声明被称为(悬摆指针).如果您访问该地址,您将获得未定义的bahaviour(UB)因为内存不再是您的,在大多数情况下您的程序将崩溃.
为了避免你做一个空指针检查,如:
if (array != nullptr)
{
/* access array */
...
}
Run Code Online (Sandbox Code Playgroud)
这是指针对地址0检查指针,地址0表示无效地址.
要进行该检查,可以将指针设置为nullptr或者NULL如果C++ 11不可用.该nullptr关键字引入了类型安全性,因为它的作用类似于指针类型,应该优先于C类NULL.在预C++ 11 NULL中定义为整数0,因为C++ 11它是别名nullptr.
要定义自己的nullptr用于预C++ 11编译器,请看这里:如何在c ++ 98中定义我们自己的nullptr?
一个有趣的事实是,delete或者delete[]在a上使用它是安全的nullptr.它写在cppreference.com上的第2点或这个SO答案.
operator delete,operator delete []
2)[...]此函数的标准库实现的行为是未定义的,除非
ptr是空指针或者是先前从operator new[](size_t)或运算符的标准库实现获得的指针new[](size_t, std::nothrow_t).
我们将指针设置为NULL(0)以避免悬空指针(指针仍然指向不再属于您的同一内存).在局部变量的情况下,如果函数在删除后没有继续(因此它的明显指针不会被重用),那么它就没那么有用了.在全球/成员poitners的情况下,它的良好做法,以避免错误.
访问已删除的指针可能会导致覆盖/读取随机内存(它可能比崩溃更危险)并导致未定义的行为,而访问NULL指针将立即崩溃.
因为c ++ 11你应该使用nullptr它因为它被定义为指针类型而NULL更多int类型并且提高了类型安全性+解决了模糊的情况.
在双删除指针的情况下,它可以安全地使用删除nullptr而没有任何反应但是如果你删除已经删除的非空指针,它将导致未定义的行为,并且很可能程序将崩溃.
在c ++中,你应该避免使用纯指针,因为有这个用法或智能指针的 STL容器(它们可以自己释放资源(RAII)).
std::vector<int> array{1,2,3,4,5};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1275 次 |
| 最近记录: |