我正在尝试做一项作业,并决定这次正确管理内存,但最终问题多于答案。我想要一个父类的子向量,例如
vector<Parent> list
,据我所知,我需要使用指针来避免切片我的对象,所以vector<Parent*>
,
然后我了解了 C++ 中的智能指针,还了解了调用父类的析构函数时可能发生的潜在内存泄漏(可能是由于智能指针超出范围之类的原因)。我不知道编写类以避免内存泄漏的正确方法是什么,我写了一个我所处位置的示例,这是打印“This is A”,我认为这意味着如果析构函数要由指针会导致内存泄漏。
public:
virtual void funct(){
cout << "This is A" << endl;
}
};
class B : public A{
public:
void funct(){
cout << "This is B" << endl;
}
};
int main() {
B b;
auto ptr = make_unique<A>(b);
ptr.get()->funct();
return 0;
}
从评论中获取信息,这是否足以导致内存泄漏,这意味着如果我删除唯一指针 ptr,是否会释放为 B 分配的内存?
class A{
public:
virtual void funct(){
cout << "This is A" << endl;
};
virtual ~A() = default;
};
class B : public A{
public:
void funct() override{
cout << "This is B" << endl;
}
~B() override = default;
};
int main() {
B b;
unique_ptr<A> ptr = make_unique<B>(b);
ptr->funct();
return 0;
}
为了确保从智能指针(实际上是任何分配的对象)正确释放内存,您只需要确保基类析构函数被标记为虚拟。
class A
{
public:
A() {}
virtual ~A() = default;
virtual void func() {};
};
class B : public A
{
public:
B() {}
};
class C : public B
{
public:
C() {}
void func() override {}
};
auto obj = std::make_unique<C>();
当
obj
超出范围时,它将正确释放内存。您甚至不需要在其他类中指定析构函数,因为它们已经获得了默认析构函数。不过,基类需要标记为虚拟,所以这就是为什么你需要在基类中指定析构函数。