繁体   English   中英

释放*时C ++内存泄漏?

[英]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;

当您删除数组时。

不要将mallocnew混合使用(首先是出于样式原因,然后是因为您永远不应该deletemalloc分配的内存或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 -mbash在你的终端)用于测试目的(如做malloc -或new -失败更容易,以确保你处理那种失败的不够好)。

这样好吗

不完全的。 有几个问题。 一个-您对free使用的麻烦-我们将在稍后解决。 但是首先,将new[]delete (non- [] )一起使用会调用未定义的行为:

在这里,您使用的是new []

nEncodedBytes = new unsigned char[m_lLenCompressedBytes];

在这里,您使用的是delete

delete (nEncodedBytes);

应该是:

delete [] nEncodedBytes;

new[]用于非[]形式的delete调用未定义行为。 现在,实际上,我所知道的所有编译器和平台都可以很好地处理这种情况,并在特定情况下可以达到预期的效果但是您永远不应依赖未定义的行为。

现在供您使用mallocfree

我不确定为什么在一个地方使用delete,而在另一个地方使用free。

你可能不应该。 这是一个经验法则:

在C ++中,请始终使用newdelete ; 永远不要使用mallocfree

是的,有例外,但首先是罕见的,其次您将确切知道例外何时开始播放。 在您在此处发布的示例中,我认为没有理由强迫使用mallocfree 因此,您不应该如此。

与流行的看法相反,在单个C ++程序中混合new / deletemalloc / free本身并不会调用Undefined Behavior或使您的程序格式错误。 如果做得正确,就可以做到。 但是你还是不应该。

有内存泄漏吗?

好吧,因为您已经调用了Undefined Behavior,所以可能会发生。 未定义的行为意味着任何事情都可能发生 但是,您正在取消分配在显示的代码中分配的所有内容。 因此,除了UB,我在这里看不到任何内存泄漏。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM