假设我有一个声明为的数组:
int* array;
我用许多整数填充数组。
如果我以后说
array = NULL;
这会释放数组中的数字占用的内存,还是只是在内存仍然存在时使数组无法使用?
int* array;
不是数组,而是指针。此时您没有数组。你不能开始做array[0] = 5;
任何事情,因为它甚至没有指向一个有效的int
对象,更不用说一个int
s 的数组了。
通过执行以下操作声明数组:
int array[5];
该数组确实有 5 个对象可供您开始分配。但是,这个数组不能是delete
d。数组不是动态分配的。
但是,如果您已经完成int* array = new int[5];
,您将通过动态分配 5 s 的数组int
并获取指向该数组中第一个元素的指针。在这种情况下,您必须 delete[] array;
. 如果您不这样做并且仅将指针设置为NULL
or nullptr
,则只会泄漏内存。
如果您使用new []
(更有可能,因为变量的名称是array
)或分配内存new
,这将导致内存泄漏。
将指针设置为NULL
不会释放内存,只会重新分配指针。换句话说,您将失去任何引用先前分配的内存的机会。
用于delete[]
释放分配的内存new[]
,并delete
释放分配的内存new
。
但是,请考虑根本不使用原始指针和手动内存管理,它们通常不需要并且容易出错。C++ 标准库带有集合和智能指针,它们在后台执行内存管理并保护您免受此类错误的影响。
当您使用代码时
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;
将数组设置为 NULL 不会释放内存。
它可用的天气将取决于周围的代码以及如何array
初始化。但是您没有提供该信息,因此其他任何事情都是猜测。
请注意,在现代 C++ 代码中使用指针是不常见的。
您应该寻求使用更合适的结构。那是什么将取决于您对我们的使用。单凭名字array
。您可能应该使用std::vector<int>
(或std::array<int>
C++11)甚至是普通的旧 C 数组int array[5]
。
它会泄漏内存,并且只有在进程退出时才会被释放。分段错误很有可能发生。
如果你有:
int *array = new int[10];
你需要使用
delete [] array;
释放内存。
基本上遵循以下规则:每当使用new XXX
deallocate withdelete XXX
或 for array allocation 进行分配时delete [] XXX
。
如果只使用array = NULL
,则只需将指针设置为NULL
,就会发生内存泄漏。