以下代码是否存在内存泄漏?

时间:2018-06-18 01:55:08

标签: c++ memory-leaks initialization memset unsigned-char

    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,这将用于进一步处理,因为获取数据有可能失败。

上面的代码会导致任何问题吗?

谢谢!

4 个答案:

答案 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)或留下悬空的指针,将会遇到问题。