C 分配给的指针:我应该释放它吗?
假设我有以下代码:C 分配给的指针:我应该释放它吗?,c,memory,malloc,free,C,Memory,Malloc,Free,假设我有以下代码: for (int i=0;i<n;i++) { //compute z float *p = (float *) malloc (sizeof(float)*z); //do something with p } 附加问题:如果时间性能是优先考虑的(而不是内存消耗),那么最好避免使用空闲(p),因为它很耗时?您可以在循环之前预先分配必要的内存量并重新使用它 如果您不知道z会有多大,我建议将分配内存的大小写在某个地方,如果z大于它,则重新分配,否则,只需重新
for (int i=0;i<n;i++) {
//compute z
float *p = (float *) malloc (sizeof(float)*z);
//do something with p
}
附加问题:如果时间性能是优先考虑的(而不是内存消耗),那么最好避免使用
空闲(p)
,因为它很耗时?您可以在循环之前预先分配必要的内存量并重新使用它
如果您不知道
z
会有多大,我建议将分配内存的大小写在某个地方,如果z
大于它,则重新分配,否则,只需重新使用已分配的内存即可 是的。你必须释放它。否则,内存会泄漏,这是很糟糕的。特别是如果你循环了很多次
一个很好的经验法则是,每个malloc
必须由一个free
匹配。总是。(这在大型项目中尤其重要)既然您将其标记为C++,您就不应该使用malloc
和free
。使用(或new
/delete
,如果您无权访问符合C++11标准的编译器)
注意:malloc
。动作:调用免费。就这么简单。可移植的、定义良好的代码需要malloc和free
分配的内存量在这里不起作用。如果内存太多,malloc
将抛出一个错误,但这与以下事实无关:free
始终需要跟随malloc
考虑使用一个缓冲区,该缓冲区被重用以避免不必要的分配。这可以通过使用std::vector
非常容易地完成:
std::向量p;
对于(int i=0;i来说,大小似乎是恒定的,那么为什么要一次又一次地分配它呢?
只需在循环之前分配一次,在循环内部开始初始化。
你可以重用内存。循环结束后释放内存
程序在循环结束后结束,您不必释放它,程序消耗的所有堆内存都将返回到操作系统,但释放分配的内存始终是一个好的做法。
关于额外问题,free并不是那么耗时,但分配内存却很耗时,所以不要担心free所消耗的时间。如果您再次重用该内存,那么只有在结束程序并只分配一次时才释放它,显然更有效(当您需要更大/更小的数组时,使用realloc()
重新分配)
您可能要为其编程的每个操作系统在程序终止时都会处理释放动态分配内存的问题。但是,由于我们主要是尽量保持代码的跨平台性,因此您应该始终free()
动态分配内存
如果你有大量的内存,只关心速度,那么显然free()
ing会“减慢”程序,但所花的时间太少了,76*(10**-8)在我的机器上,对于一个1024字节的块,它是相当微不足道的。为什么这里是C++标签?@ EdgarRokyan你是对的。谢谢你的回答。但是,如果我们谈论的是高性能的应用程序,自由< /COD>可能是费时的,所以即使内存效率低,它也可以在时间上更有效。oWorld不会以牺牲正确性为代价来追求效率。如果性能对你来说很重要,那么就预先分配内存并重用它。在任何情况下,在malloc
之后调用free
。如果内存量如你所说,那么想出一个聪明的方法来做。找出一个模式并想出一些偷偷摸摸的方法,但不要浪费时间免费获取亲爱的先生。free
。收到,先生,我不会忘记他:谢谢你的答案。z
是高度可变的,可能有几百到几十万(这是SIFT算法检测到的关键点的数量,完全取决于输入图像)。然后,如果Z大于先前的高Z,则只需重新分配内存。谢谢你的回答。我从未使用过智能指针,但我的问题是:如果我执行v.push_back(p),会出现什么情况
wherestd::vector
并且我在for
循环外部使用v
?p
将在作用域结束时自动释放?如果使用std::vector
,则定义了堆分配数组的堆分配可调整大小数组。您可能希望改为使用std::vector
。我做了一个不久前,如果你喜欢通过视频学习,我认为这将是一个很好的开始。
for (int i=0;i<n;i++) {
//compute z
float *p = (float *) malloc (sizeof(float)*z);
//do something with p
free(p);
}
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
}
// 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
std::vector<float> p;
for (int i=0;i<n;i++) {
//compute z
p.resize( z );
//do something with p
}