假设我有一个声明为:
的数组int* array;
并且我用尽可能多的整数填充数组。
如果我后来说
array = NULL;
这是否释放了数组占用的数据所占用的内存,或者只是在内存仍然存在的情况下使数组无法使用?
答案 0 :(得分:4)
int* array;
不是数组,而是指针。此时你没有数组。您无法开始执行array[0] = 5;
或任何事情,因为它甚至没有指向有效的int
对象,更不用说int
的数组了。
通过执行以下方式声明数组:
int array[5];
此数组 有5个对象可供您开始分配。但是,此数组不得为delete
d。该数组未动态分配。
但是,如果您已完成int* array = new int[5];
,则可以动态分配5 int
的数组并获取指向该数组中第一个元素的指针。在这种情况下,您必须 delete[] array;
。如果不这样做,只将指针设置为NULL
或nullptr
,则只会泄漏内存。
答案 1 :(得分:3)
如果您使用new []
分配内存(更有可能,因为变量的名称为array
)或new
,这将导致内存泄漏强>
将指针设置为NULL
不会释放内存,只会重新指定指针。换句话说,您将失去参考先前分配的内存的机会。
使用delete[]
释放分配有new[]
的内存,delete
释放分配有new
的内存。
但是,根本不考虑不使用原始指针和手动内存管理,它们通常不需要且容易出错。 C ++标准库附带了集合和智能指针,可以在引擎盖下执行内存管理,让您远离这种错误。
答案 2 :(得分:3)
使用代码时
int *array;
array = NULL;
你已经初始化了指针。将数据分配给* array
时int *array;
array[1] = 3;
您获得了未定义的行为,但在大多数情况下会出现访问冲突。在写入之前分配内存并为指针
分配NULLint *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}},就会发生内存泄漏。