删除动态分配的变量设置指针为0

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是愚蠢的,但这通常在初学者的代码中看到. (3认同)
  • @Sossisos——它**愚蠢**的原因是,在析构函数运行之后,对象**不存在**并且**没有指针**可以重用。缺点是,它让编写代码的人看起来像是通过口号而不是思考来编写的。 (2认同)

koc*_*ica 8

我们将指针设置为NULL(0)以避免悬空指针(指针仍然指向不再属于您的同一内存).在局部变量的情况下,如果函数在删除后没有继续(因此它的明显指针不会被重用),那么它就没那么有用了.在全球/成员poitners的情况下,它的良好做法,以避免错误.

访问已删除的指针可能会导致覆盖/读取随机内存(它可能比崩溃更危险)并导致未定义的行为,而访问NULL指针将立即崩溃.

因为你应该使用nullptr它因为它被定义为指针类型而NULL更多int类型并且提高了类型安全性+解决了模糊的情况.

在双删除指针的情况下,它可以安全地使用删除nullptr而没有任何反应但是如果你删除已经删除的非空指针,它将导致未定义的行为,并且很可能程序将崩溃.

你应该避免使用纯指针,因为有这个用法或智能指针的 STL容器(它们可以自己释放资源(RAII)).

std::vector<int> array{1,2,3,4,5};
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

1275 次

最近记录:

8 年,1 月 前