以下代码是否可能存在内存泄漏?
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;
但不建议使用原始的new
和delete
,更好的解决方案是使用vector
,它也将数据初始化为零:
std::vector<unsigned char> bin_data(200);
如果您需要指向数据的非常量指针,可以使用 unique_ptr
或 shared_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)或留下悬空指针,您会遇到问题。
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;
但不建议使用原始的new
和delete
,更好的解决方案是使用vector
,它也将数据初始化为零:
std::vector<unsigned char> bin_data(200);
如果您需要指向数据的非常量指针,可以使用 unique_ptr
或 shared_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)或留下悬空指针,您会遇到问题。