unsigned char *bin_data;
unsigned char *bin_model;
bin_data = new unsigned char[200];
memset(bin_data, 0, 200);
bin_model = new unsigned char[200];
memset(bin_model, 0, 200);
我正在审查上面的代码,我有一种直觉,认为它可能会导致内存泄漏,但我逻辑上找不到原因。
我认为这是因为我们将memset指向0,数据的地址可能会丢失。我们想要做的只是在从接口获取数据之前初始化bin_data和bin_model,这将用于进一步处理,因为获取数据有可能失败。
上面的代码会导致任何问题吗?
谢谢!
答案 0 :(得分:5)
memset(bin_data, 0, 200);
...从bin_data
指向的地址开始写入200个零。 memset
不会将指针本身覆盖为零。地址保持不变。
如果此代码中存在内存泄漏,则可能是由于缺少delete[]
。
答案 1 :(得分:1)
是的,您需要删除已分配的内存以防止内存泄漏:
i
但不建议使用原始delete[] bin_data;
delete[] bin_model;
和new
,更好的解决方案是使用delete
,它还会将数据初始化为零:
vector
如果您需要一个指向数据的非const指针,您可以使用std::vector<unsigned char> bin_data(200);
或unique_ptr
自动释放内存。
C ++ 11:
shared_ptr
C ++ 14:
auto bin_data = std::unique_ptr<unsigned char[]>(new unsigned char[200]);
您可以使用auto bin_data = std::make_uniue<unsigned char[]>(200);
答案 2 :(得分:1)
我认为这是因为我们将memset指向0,数据的地址可能会丢失。
memset
将地址作为第一个值。您传递的指针指向堆中的某个位置。指针本身存储在堆栈中。指向的缓冲区被覆盖,指针未被触及。
因为你标记了这个&#34; C ++&#34;你应该注意其他答案中的建议:智能指针是要走的路,不要使用裸指针进行像这样的堆分配。
答案 3 :(得分:0)
我认为如果您不清除在堆上添加的内存(使用关键字delete)或留下悬空的指针,将会遇到问题。