【问题标题】:"delete" pointer without destroying data“删除”指针而不破坏数据
【发布时间】:2015-01-13 08:10:26
【问题描述】:

我对 C++ 比较陌生。我正在分配一个缓冲区:

uint8 *buffer = new uint8[len];

使用第 3 方库,我使用“img”对象(它是一张图片)的方法来“接管”缓冲区作为原始图像数据:

img->SetBuffer((uint8*)data);

我怀疑实际上“接管”意味着“img”对象有自己的指针,在“SetBuffer”之后指向“缓冲区”中的数据。一切正常,但我的编译器抱怨内存泄漏(这是一个警告,而不是错误)。如果我在 SetBuffer 之后添加这一行:“delete buffer;”,警告就会消失,但同时我的“img”会变成空白(没有数据)。如何避免编译器警告并保留数据?有没有办法只删除“缓冲区”指针本身,而不破坏它指向的数据?稍后在代码中,我删除了“img”对象,我猜它会清除所有图像数据。

【问题讨论】:

  • 如果有的话,你应该delete[] buffer
  • 你可能没有删除图像的内存。我想它们都指向同一个地方,所以只应该删除一个。检查是否删除了通过其中一个指针分配的内存。仅在该内存块中使用结束时。顺便说一句,״delete[] x".
  • 编译器的确切信息是什么?
  • “有没有办法只删除 'buffer' 指针本身,而不破坏它指向的数据?” 这没有意义。

标签: c++ pointers buffer delete-operator


【解决方案1】:

您应该阅读该类的文档(或源代码)(*img 的类型)。

  1. 检查您对SetBuffer 的假设是否正确。
  2. 检查类是否在销毁时释放缓冲区。

如果类不销毁缓冲区本身,则必须在销毁 img 指向的对象后进行。

-编辑-

正如 MSalters 正确指出的,如果内存由类本身释放,您当然应该使用适当的分配方案(即使用 new[]delete[]allocator::allocate()allocator::deallocate()malloc() 和 @987654329 @...)

[Rem:您的问题表明该类没有按照您使用它的方式进行任何释放。]

【讨论】:

  • 另外,如果类释放内存,你应该使用相应的分配机制。例如。如果班级会(愚蠢地)调用free(),那么你必须配合使用malloc()
  • 你是对的。为了便于理解,我将添加它。
【解决方案2】:

如果 img 没有释放其缓冲区,则必须在释放 img 后释放。

delete img;
delete [] buffer;

【讨论】:

  • 谢谢,简短而甜蜜。
猜你喜欢
  • 2022-07-27
  • 1970-01-01
  • 2014-01-23
  • 2017-01-18
  • 2021-05-07
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 2019-03-31
相关资源
最近更新 更多