【发布时间】: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