我在虚空中使用它:
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);
这样好吗?我不确定为什么我在一个地方使用删除,而在另一个地方使用删除。 我复制了我的代码。
是否有内存泄漏?
谢谢。
答案 0 :(得分:4)
使用free
时使用malloc
。很有可能,你不应该在C ++中使用malloc
;它是C语言的做法,在C ++中很少需要。
使用delete
分配时,您使用new
。 new
调用构造函数以及分配内存,delete
调用析构函数以及释放内存。因此,这些是面向对象的C ++选项。然而,有一个皱纹。因为如果你分配一个数组(例如nEncodedBytes = new unsigned char[m_lLenCompressedBytes];
),C ++的实现不知道指针是指引用数组还是单个对象,那么你应该使用delete[]
而不是delete
来释放它。
请注意,未能调用delete[]
只意味着您只会为数组中的第一个对象调用析构函数,因此,在这种特殊情况下应该没有区别调用delete[]
和调用delete
之间的结果,因为char
没有析构函数。
我的代码中没有发现内存泄漏,但由于您尚未发布所有代码,我们无法分辨。
答案 1 :(得分:2)
你应该使用
delete [] nEncodedBytes;
delete [] shrtDecoded;
正在删除数组。
答案 2 :(得分:2)
不要混用malloc
和new
(首先是因为文体原因,然后因为你永远不应该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 ++中,始终使用
malloc
和free
;永远不要使用new
和delete
。
是的,有例外,但它们首先是罕见的,其次你会确切地知道什么时候发生例外。在您发布的示例中,我认为没有理由强制使用malloc
和free
。因此,你不应该。
与(流行的?)信念相反,在单个C ++程序中混合malloc
/ free
和new
/ delete
本身并不会调用未定义的行为或使您的程序原本不正确。如果你做得好,你可以做到。但你仍然不应该。
是否有内存泄漏?
好吧,既然你已经调用了未定义的行为,那么可能会有。未定义的行为意味着任何可能发生的事情。但是,您将在显示的代码中取消分配您分配的所有内容。所以除了UB,我发现这里没有内存泄漏。