0

I am using this in a void:

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

When I am done, I free the memory using

delete (nEncodedBytes);
delete (shrtDecoded);

    free(m_DataBytes);
    free(m_ShortOut);

Is this fine? I am unsure why I was using delete in one place, and free in the other. I copied my code around.

Is there a memory leak?

Thank you.

4

4 回答 4

4

你用的free时候用malloc。很可能,您根本不应该malloc在 C++ 中使用;这是 C 的做事方式,在 C++ 中很少需要。

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

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

我没有在您的代码中看到内存泄漏,但由于您尚未发布所有代码,我们无法判断。

于 2013-10-09T15:49:29.700 回答
2

你应该使用

delete [] nEncodedBytes;
delete [] shrtDecoded;

当您删除数组时。

于 2013-10-09T15:45:10.210 回答
2

不要混用mallocand new(首先是因为风格原因,然后是因为你不应该使用delete-ed  malloc内存或-ed 区域)。考虑使用标准C++ 容器。您甚至不需要显式分配内存(库会为您执行此操作)。你可以编码freenew

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- 失败,以确保您能够很好地处理这种故障)。

于 2013-10-09T15:45:28.117 回答
0

这样好吗?

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

你在这里使用new []

nEncodedBytes = new unsigned char[m_lLenCompressedBytes];

在这里你正在使用delete

delete (nEncodedBytes);

这应该是:

delete [] nEncodedBytes;

[]for ofnew与非[]形式 of一起使用会delete调用未定义的行为。现在实际上,我所知道的所有编译器和平台都可以很好地处理这个问题,并在这种特殊情况下做你所期望的——但你永远不应该依赖未定义的行为。

现在供您使用mallocand free

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

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

在 C++ 中,始终使用newand delete; 永远不要使用mallocand free

是的,有例外,但首先它们很少见,其次你会确切地知道例外何时发挥作用。在您在此处发布的示例中,我认为没有理由强制使用mallocand free。因此,你不应该。

与(流行的?)信念相反,在单个 C++ 程序中混合new/deletemalloc/free本身不会调用未定义行为或使您的程序格式错误。你可以做到,只要你做得好。但你仍然不应该。

有内存泄漏吗?

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

于 2013-10-09T16:12:52.990 回答