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

Is there a possible memory leak for the codes below?

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

我正在查看上面的代码,我直觉它可能会导致内存泄漏,但我逻辑上找不到原因。

我在想这是因为我们将指针设置为0,数据的地址可能会丢失。我们想要做的只是在从接口获取数据之前初始化 bin_data 和 bin_model,因为获取数据有可能失败。

上面的代码会不会有什么问题?

谢谢!

memset(bin_data, 0, 200);

...从 bin_data 指向的地址开始写入 200 个零。 memset 不会将指针本身覆盖为零。地址保持不变。

如果此代码中存在内存泄漏,那将是由于缺少 delete[]

是的,您需要删除分配的内存以防止内存泄漏:

delete[] bin_data;
delete[] bin_model;

但不建议使用原始的newdelete,更好的解决方案是使用vector,它也将数据初始化为零:

std::vector<unsigned char> bin_data(200);

如果您需要指向数据的非常量指针,可以使用 unique_ptrshared_ptr 自动释放内存。

C++11:

auto bin_data = std::unique_ptr<unsigned char[]>(new unsigned char[200]);

C++14:

auto bin_data = std::make_uniue<unsigned char[]>(200);

你可以用bin_data.get()

得到底层指针

I am thinking it is because we have memset a pointer to 0, the address of the data might be lost.

memset 将地址作为第一个值。您传递的指针指向堆中的某个位置。指针本身存储在堆栈中。指向的缓冲区被覆盖,指针未被触及。

既然你标记了这个 "C++" 你真的应该注意其他答案中的建议:智能指针是正确的方法,不要像这样使用裸指针进行堆分配。

我认为如果不清除添加到堆上的内存(使用关键字 delete)或留下悬空指针,您会遇到问题。