[英]C++ Memory leak when freeing *?
我在空白中使用此:
unsigned char *nEncodedBytes = NULL;
nEncodedBytes = new unsigned char[m_lLenCompressedBytes];
short *shrtDecoded = NULL;
shrtDecoded = new short[iCountDecodedShorts];
short *m_ShortOut;
m_ShortOut = (short*)malloc(( 960*6)*sizeof(short));
unsigned char *m_DataBytes;
m_DataBytes = (unsigned char*)calloc((960*6),sizeof(char));
完成后,我使用释放内存
delete (nEncodedBytes);
delete (shrtDecoded);
free(m_DataBytes);
free(m_ShortOut);
这样好吗 我不确定为什么在一个地方使用delete,而在另一个地方使用free。 我复制了我的代码。
有内存泄漏吗?
谢谢。
使用malloc
时可以使用free
。 在所有情况下,您都不应该在C ++中使用malloc
。 这是C的处理方式,在C ++中很少使用。
使用new
分配时,可以使用delete
。 new
调用构造函数以及分配内存, delete
调用析构函数以及释放内存。 因此,这些是面向对象的C ++选项。 但是,有皱纹。 因为C ++的实现不知道如果分配数组时指针是指向数组还是指向单个对象(例如nEncodedBytes = new unsigned char[m_lLenCompressedBytes];
),则应使用delete[]
而不是delete
来释放它。
请注意,不调用delete[]
仅意味着您将仅调用数组中第一个对象的析构函数,因此, 在这种特殊情况下 ,调用delete[]
与调用delete
之间的结果应该没有区别,因为char
具有没有破坏者。
我看不到您的代码中发生内存泄漏,但是由于您尚未发布所有代码,因此我们无法告知。
你应该用
delete [] nEncodedBytes;
delete [] shrtDecoded;
当您删除数组时。
不要将malloc
和new
混合使用(首先是出于样式原因,然后是因为您永远不应该delete
由malloc
分配的内存或free
new
ed区域)。 考虑使用标准C ++容器 。 您甚至不需要显式分配内存(库将为您完成此操作)。 你可以编码
std::vector<char> nEncodedBytes;
nEncodedBytes.resize(encodedbyteslen);
在Linux上,使用valgrind搜索内存泄漏。 顺便说一句,您可能会对Boehm的GC感兴趣,也许使用了这里的分配器。
顺便说一句,使用自己的malloc
您应该始终测试其结果,至少像
SomeType* ptr = malloc(sizeof(SomeType));
if (!ptr) { perror("malloc SomeType"); exit(EXIT_FAILURE); };
请记住, malloc
可能会失败。 您可能需要限制可用内存(例如使用ulimit -m
中bash
在你的终端)用于测试目的(如做malloc
-或new
-失败更容易,以确保你处理那种失败的不够好)。
这样好吗
不完全的。 有几个问题。 一个-您对free
使用的麻烦-我们将在稍后解决。 但是首先,将new[]
与delete
(non- []
)一起使用会调用未定义的行为:
在这里,您使用的是new []
:
nEncodedBytes = new unsigned char[m_lLenCompressedBytes];
在这里,您使用的是delete
:
delete (nEncodedBytes);
应该是:
delete [] nEncodedBytes;
将new
的[]
用于非[]
形式的delete
调用未定义行为。 现在,实际上,我所知道的所有编译器和平台都可以很好地处理这种情况,并在特定情况下可以达到预期的效果,但是您永远不应依赖未定义的行为。
现在供您使用malloc
和free
:
我不确定为什么在一个地方使用delete,而在另一个地方使用free。
你可能不应该。 这是一个经验法则:
在C ++中,请始终使用
new
和delete
; 永远不要使用malloc
和free
。
是的,有例外,但首先是罕见的,其次您将确切知道例外何时开始播放。 在您在此处发布的示例中,我认为没有理由强迫使用malloc
和free
。 因此,您不应该如此。
与流行的看法相反,在单个C ++程序中混合new
/ delete
和malloc
/ free
本身并不会调用Undefined Behavior或使您的程序格式错误。 如果做得正确,就可以做到。 但是你还是不应该。
有内存泄漏吗?
好吧,因为您已经调用了Undefined Behavior,所以可能会发生。 未定义的行为意味着任何事情都可能发生 。 但是,您正在取消分配在显示的代码中分配的所有内容。 因此,除了UB,我在这里看不到任何内存泄漏。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.