1

假设我有一个声明为的数组:

int* array;

我用许多整数填充数组。

如果我以后说

array = NULL;

这会释放数组中的数字占用的内存,还是只是在内存仍然存在时使数组无法使用?

4

7 回答 7

4

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

通过执行以下操作声明数组:

int array[5];

该数组确实有 5 个对象可供您开始分配。但是,这个数组不能deleted。数组不是动态分配的。

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

于 2013-02-12T14:12:48.120 回答
3

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

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

用于delete[]释放分配的内存new[],并delete释放分配的内存new

但是,请考虑根本不使用原始指针和手动内存管理,它们通常不需要并且容易出错。C++ 标准库带有集合和智能指针,它们在后台执行内存管理并保护您免受此类错误的影响。

于 2013-02-12T14:12:28.900 回答
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;
于 2013-02-12T14:15:20.933 回答
1

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

它可用的天气将取决于周围的代码以及如何array初始化。但是您没有提供该信息,因此其他任何事情都是猜测。

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

于 2013-02-12T14:11:07.230 回答
0

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

于 2013-02-12T14:11:35.960 回答
0

如果你有:

int *array = new int[10];

你需要使用

delete [] array;

释放内存。

于 2013-02-12T14:12:49.990 回答
0

基本上遵循以下规则:每当使用new XXXdeallocate withdelete XXX或 for array allocation 进行分配时delete [] XXX

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

于 2013-02-12T14:12:59.490 回答