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

时间:2013-10-09 15:42:51

标签: c++ memory-leaks

我在虚空中使用它:

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);

这样好吗?我不确定为什么我在一个地方使用删除,而在另一个地方使用删除。 我复制了我的代码。

是否有内存泄漏?

谢谢。

4 个答案:

答案 0 :(得分:4)

使用free时使用malloc。很有可能,你不应该在C ++中使用malloc;它是C语言的做法,在C ++中很少需要。

使用delete分配时,您使用newnew调用构造函数以及分配内存,delete调用析构函数以及释放内存。因此,这些是面向对象的C ++选项。然而,有一个皱纹。因为如果你分配一个数组(例如nEncodedBytes = new unsigned char[m_lLenCompressedBytes];),C ++的实现不知道指针是指引用数组还是单个对象,那么你应该使用delete[]而不是delete来释放它。

请注意,未能调用delete[]只意味着您只会为数组中的第一个对象调用析构函数,因此,在这种特殊情况下应该没有区别调用delete[]和调用delete之间的结果,因为char没有析构函数。

我的代码中没有发现内存泄漏,但由于您尚未发布所有代码,我们无法分辨。

答案 1 :(得分:2)

你应该使用

delete [] nEncodedBytes;
delete [] shrtDecoded;

正在删除数组。

答案 2 :(得分:2)

不要混用mallocnew(首先是因为文体原因,然后因为你永远不应该delete malloc - 内存或{{1} } free - ed区域)。考虑使用标准C++ containers。您甚至不需要显式分配内存(库将为您执行此操作)。 你可以编码

new

在Linux上,使用valgrind来查找内存泄漏。顺便说一句,您可能对Boehm's GC感兴趣,也许使用像here这样的分配器。

BTW,当你自己使用std::vector<char> nEncodedBytes; nEncodedBytes.resize(encodedbyteslen); 时,你应该总是测试它的结果,至少像

一样
malloc

请记住 SomeType* ptr = malloc(sizeof(SomeType)); if (!ptr) { perror("malloc SomeType"); exit(EXIT_FAILURE); }; 可能会失败。您可能希望限制可用内存(例如,在终端的malloc中使用ulimit -m)以进行测试(例如,使bash - 或malloc - 更容易失败确保你能很好地处理这种失败。)

答案 3 :(得分:0)

  

这样可以吗?

不完全。有几个问题。一个 - 你free的麻烦使用 - 我们马上就会解决。但首先,您使用new[]delete(非 - [])会调用未定义的行为:

您正在使用new []

nEncodedBytes = new unsigned char[m_lLenCompressedBytes];

此处您正在使用delete

delete (nEncodedBytes);

这应该是:

delete [] nEncodedBytes;

使用[]的{​​{1}} for { - {1}}形式的new调用未定义的行为。现在实际上,所有的编译器和我知道的平台会处理这个问题,并且在这种特殊情况下做你期望的 - 但你不应该依赖未定义的行为。

现在您可以使用[]delete

  

我不确定为什么我在一个地方使用删除,然后免费使用   其他

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

  

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

是的,有例外,但它们首先是罕见的,其次你会确切地知道什么时候发生例外。在您发布的示例中,我认为没有理由强制使用mallocfree。因此,你不应该。

与(流行的?)信念相反,在单个C ++程序中混合malloc / freenew / delete本身并不会调用未定义的行为或使您的程序原本不正确。如果你做得好,你可以做到。但你仍然不应该。

  

是否有内存泄漏?

好吧,既然你已经调用了未定义的行为,那么可能会有。未定义的行为意味着任何可能发生的事情。但是,您将在显示的代码中取消分配您分配的所有内容。所以除了UB,我发现这里没有内存泄漏。