【问题标题】:Wouldn't this cause a memory leak?这不会导致内存泄漏吗?
【发布时间】:2022-06-13 20:01:25
【问题描述】:

考虑这个层次结构:

struct A { uint8_t id };
struct B : A { uint8_t data };
struct C : A { uint16_t data };

现在看看这段代码:

A* o = nullptr;

uint8_t id;
m_stream.read((char*)&id, 1);

if (id < 64)
{
    uint8_t data = 0;
    m_stream.read((char*)&data, 1);
    o = new B{ id, data };
}
else
{
    uint16_t data = 0;
    m_stream.read((char*)&data, 2);
    o = new C{ id, data };
}

// delete o ???

我在 FLTK 中看到过很多次这样的代码(代码使用 new 而不删除,在 new 运算符的帮助下将基类指针转换为派生类对象),没有任何删除语句。

  • 我看过new总是需要delete,所以上面的代码会不会造成内存泄露, 或者 FLTK 是否遵循不良代码实践?
  • 我还想将所有o 对象添加到数组中,将使用delete 创建数组 无法使用?但是,什么时候才能释放内存呢?
  • 如果我继续将new 用于o,是否需要分配包含数组 new 也一样?

我记得曾经使用过unique_ptr 及其reset 方法,但我不记得如何这样做了,我不确定唯一指针是否应该是首选解决方案。我讨厌每个 C++ 问题都归结为 depends 而不是 永远不要使用这个,这是旧的,总是使用这个

【问题讨论】:

  • new 没有delete 是泄漏是的。但是,也许它稍后会被删除。不看原代码很难说
  • “我也想将所有的o对象添加到数组中”您的意思是要将指向对象的指针添加到数组中吗?

标签: c++ memory-management new-operator unique-ptr


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