分配给 for 的指针:我应该释放它吗?
Pointer allocated in for: should I have to free it?
假设我有这个代码:
for (int i=0;i<n;i++) {
//compute z
float *p = (float *) malloc (sizeof(float)*z);
//do something with p
}
请注意,p
未在其他任何地方使用,并且每个 for
循环彼此独立。
假设z
不是那么大,那么单 p
就内存而言并没有那么昂贵。但是,n
可能很大,所以p
占用的总内存可以保持一致。
free()
是否正确:
for (int i=0;i<n;i++) {
//compute z
float *p = (float *) malloc (sizeof(float)*z);
//do something with p
free(p);
}
奖金问题: 如果时间性能是优先考虑的(而不是内存消耗),最好避免 free(p)
,因为它很耗时?
您可以在循环之前预先分配必要的内存量并重新使用它。
如果您不知道 z
有多大 - 我建议在某处写下已分配内存的大小,如果 z
大于它 - 然后重新分配,否则 - 只需重新使用已分配的内存。
是的。你必须 free
它。否则你会发生内存泄漏,这很糟糕。特别是如果你循环很多次。
一个好的经验法则是每个 malloc
必须与 free
匹配。总是。 (这对大型项目尤为重要)
既然你用 C++ 标记了它,你就不应该使用 malloc
和 free
。使用 smart pointers (或 new
/delete
如果您无法访问 C++11 兼容的编译器).
for (int i=0;i<n;i++) {
// compute z
std::unique_ptr<float[]> p{new float[z]};
// do something with p
// p gets automatically freed at the end of the scope
}
回答您的问题:
Is it correct to free() it with...
是的。如果你用 malloc
分配一些东西,你总是需要 free
它。
would be better to avoid the free(p), since it's time consuming?
是的。考虑在循环外预分配内存位置。
// preallocate
std::unique_ptr<float[]> p{new float[z]};
for (int i=0;i<n;i++) {
// clear p
// compute z
// do something with p
}
// p gets automatically freed at the end of the scope
观察:malloc
被使用。行动:调用 free
。就这么简单。可移植的、定义明确的代码需要 malloc
和 free
.
分配的内存量在这里不起作用。如果内存太多,malloc
将引发错误,但这与您始终需要 free
跟随 malloc
.
的事实无关。
考虑使用可重复使用的缓冲区以避免不必要的分配。这可以很容易地通过使用 std::vector<float>
:
来完成
std::vector<float> p;
for (int i=0;i<n;i++) {
//compute z
p.resize( z );
//do something with p
}
在最坏的情况下,您会得到 O(log n)
内存分配。使用您的代码,您将获得 n
内存分配。不调用 free()
只会导致内存泄漏。 std::vector<float>
最终会自动清理内存。
看起来大小是恒定的,为什么要一次又一次分配呢?
只需在循环之前分配一次,在循环内部初始化。
您可以重复使用内存。并在循环结束后释放内存。
并且程序在循环后结束那么你不必释放它,程序消耗的所有堆内存都会返回给OS,但释放总是一个好习惯你分配的内存。
关于bonus的问题,free没那么耗时,分配内存就是,所以不用担心free耗的时间。
如果您再次重用该内存 - 显然只有在您结束程序时才释放它并且只分配一次(并在需要 bigger/smaller 数组时使用 realloc()
重新分配)效率更高.
您可能会编程的每个 OS 都将在您的程序终止时处理释放动态分配的内存。但是,由于我们主要尝试使我们的代码尽可能跨平台,因此您应该始终 free()
动态分配内存。
至于如果你有大量的内存并且只关心速度 - 那么显然 free()
ing 会 'slow down' 程序,但是它花费的时间少得离谱, 76*(10**-8)
在我简陋的机器上,对于 1024 字节的块,所以它是相当微不足道的。
假设我有这个代码:
for (int i=0;i<n;i++) {
//compute z
float *p = (float *) malloc (sizeof(float)*z);
//do something with p
}
请注意,p
未在其他任何地方使用,并且每个 for
循环彼此独立。
假设z
不是那么大,那么单 p
就内存而言并没有那么昂贵。但是,n
可能很大,所以p
占用的总内存可以保持一致。
free()
是否正确:
for (int i=0;i<n;i++) {
//compute z
float *p = (float *) malloc (sizeof(float)*z);
//do something with p
free(p);
}
奖金问题: 如果时间性能是优先考虑的(而不是内存消耗),最好避免 free(p)
,因为它很耗时?
您可以在循环之前预先分配必要的内存量并重新使用它。
如果您不知道 z
有多大 - 我建议在某处写下已分配内存的大小,如果 z
大于它 - 然后重新分配,否则 - 只需重新使用已分配的内存。
是的。你必须 free
它。否则你会发生内存泄漏,这很糟糕。特别是如果你循环很多次。
一个好的经验法则是每个 malloc
必须与 free
匹配。总是。 (这对大型项目尤为重要)
既然你用 C++ 标记了它,你就不应该使用 malloc
和 free
。使用 smart pointers (或 new
/delete
如果您无法访问 C++11 兼容的编译器).
for (int i=0;i<n;i++) {
// compute z
std::unique_ptr<float[]> p{new float[z]};
// do something with p
// p gets automatically freed at the end of the scope
}
回答您的问题:
Is it correct to free() it with...
是的。如果你用 malloc
分配一些东西,你总是需要 free
它。
would be better to avoid the free(p), since it's time consuming?
是的。考虑在循环外预分配内存位置。
// preallocate
std::unique_ptr<float[]> p{new float[z]};
for (int i=0;i<n;i++) {
// clear p
// compute z
// do something with p
}
// p gets automatically freed at the end of the scope
观察:malloc
被使用。行动:调用 free
。就这么简单。可移植的、定义明确的代码需要 malloc
和 free
.
分配的内存量在这里不起作用。如果内存太多,malloc
将引发错误,但这与您始终需要 free
跟随 malloc
.
考虑使用可重复使用的缓冲区以避免不必要的分配。这可以很容易地通过使用 std::vector<float>
:
std::vector<float> p;
for (int i=0;i<n;i++) {
//compute z
p.resize( z );
//do something with p
}
在最坏的情况下,您会得到 O(log n)
内存分配。使用您的代码,您将获得 n
内存分配。不调用 free()
只会导致内存泄漏。 std::vector<float>
最终会自动清理内存。
看起来大小是恒定的,为什么要一次又一次分配呢? 只需在循环之前分配一次,在循环内部初始化。 您可以重复使用内存。并在循环结束后释放内存。
并且程序在循环后结束那么你不必释放它,程序消耗的所有堆内存都会返回给OS,但释放总是一个好习惯你分配的内存。 关于bonus的问题,free没那么耗时,分配内存就是,所以不用担心free耗的时间。
如果您再次重用该内存 - 显然只有在您结束程序时才释放它并且只分配一次(并在需要 bigger/smaller 数组时使用 realloc()
重新分配)效率更高.
您可能会编程的每个 OS 都将在您的程序终止时处理释放动态分配的内存。但是,由于我们主要尝试使我们的代码尽可能跨平台,因此您应该始终 free()
动态分配内存。
至于如果你有大量的内存并且只关心速度 - 那么显然 free()
ing 会 'slow down' 程序,但是它花费的时间少得离谱, 76*(10**-8)
在我简陋的机器上,对于 1024 字节的块,所以它是相当微不足道的。