【问题标题】:Is there a possible memory leak for the codes below?下面的代码是否可能存在内存泄漏?
【发布时间】:2018-11-26 20:23:02
【问题描述】:
    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 的 memset 指针,数据的地址可能会丢失。我们想要做的只是在从接口获取数据之前初始化 bin_data 和 bin_model 将用于进一步处理,因为获取数据有可能失败。

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

谢谢!

【问题讨论】:

  • 你能教育我吗?
  • 不要混合使用 C、C++ 和 Java

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


【解决方案1】:
memset(bin_data, 0, 200);

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

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

【讨论】:

  • 我明白了。现在一切都说得通了。非常感谢!
【解决方案2】:

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

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()获取底层指针

【讨论】:

  • 谢谢@krisz。我也计划提出独特的指针来改进上面的代码。 :)
【解决方案3】:

我在想这是因为我们有一个指向 0 的 memset 指针,数据的地址可能会丢失。

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多