将数组(int *)设置为NULL是否释放它占用的内存?

时间:2013-02-12 14:09:26

标签: c++ arrays pointers memory null

假设我有一个声明为:

的数组
int* array;

并且我用尽可能多的整数填充数组。

如果我后来说

array = NULL;

这是否释放了数组占用的数据所占用的内存,或者只是在内存仍然存在的情况下使数组无法使用?

7 个答案:

答案 0 :(得分:4)

int* array;不是数组,而是指针。此时你没有数组。您无法开始执行array[0] = 5;或任何事情,因为它甚至没有指向有效的int对象,更不用说int的数组了。

通过执行以下方式声明数组:

int array[5];

此数组 有5个对象可供您开始分配。但是,此数组不得delete d。该数组未动态分配。

但是,如果您已完成int* array = new int[5];,则可以动态分配5 int的数组并获取指向该数组中第一个元素的指针。在这种情况下,您必须 delete[] array;。如果不这样做,只将指针设置为NULLnullptr,则只会泄漏内存。

答案 1 :(得分:3)

如果您使用new []分配内存(更有可能,因为变量的名称为array)或new,这将导致内存泄漏

将指针设置为NULL不会释放内存,只会重新指定指针。换句话说,您将失去参考先前分配的内存的机会。

使用delete[]释放分配有new[]的内存,delete释放分配有new的内存。

但是,根本不考虑使用原始指针和手动内存管理,它们通常不需要且容易出错。 C ++标准库附带了集合和智能指针,可以在引擎盖下执行内存管理,让您远离这种错误。

答案 2 :(得分:3)

使用代码时

int *array;
array = NULL;

你已经初始化了指针。将数据分配给* array

int *array;
array[1] = 3;

您获得了未定义的行为,但在大多数情况下会出现访问冲突。在写入之前分配内存并为指针

分配NULL
int *array;
array = new int[3];
array[0] = 2;
array[2] = 4;
array = NULL;

你得到了内存泄漏。当你删除数据时,一切都应该没问题:

int *array;
array = new int[3];
array[0] = 2;
array[2] = 4;
delete[] array;
array = NULL;

答案 3 :(得分:1)

将数组设置为NULL会使释放内存。

它可用的天气将取决于周围的代码以及array的初始化方式。但是你没有提供这些信息,所以其他任何东西都是猜测。

请注意,在现代C ++代码中使用指针是不常见的 您应该寻求使用更合适的结构。这取决于您对我们的使用方式。仅基于名称array。您可能应该使用std::vector<int>(或std::array<int> C ++ 11)甚至是普通的旧C数组int array[5]

答案 4 :(得分:0)

它将泄漏内存,只有在进程退出时才会释放它。 很可能发生分段错误。

答案 5 :(得分:0)

如果你有:

int *array = new int[10];

你需要使用

delete [] array;

释放记忆。

答案 6 :(得分:0)

基本遵循以下规则:每次使用new XXX分配delete XXX或使用delete [] XXX分配array = NULL

如果您只使用NULL,则只需将指针设置为{{1}},就会发生内存泄漏。