我有一个递归问题,我试图解决。如果可以执行给定操作,则可能存在其他子操作,等等。我的解决方案就是这样一个类:
// MyObj.h
#include <vector>
class MyObj
{
private:
std::vector<MyObj*> _children;
public:
void addChild(MyObj* m);
}
// MyObj.cpp
#include "MyObj.h"
void MyObj::addChild(MyObj* m)
{
MyObj::_children.push_back(m);
}
我正在使用这样的课程:
MyObj m;
MyObj *child = new MyObj();
m.addChild(child);
我的理解是,因为我在堆上分配了child
,所以我需要在以后销毁它。如果创建该对象的代码没有维护该引用,那么它将取决于父对象以销毁它。是否适合定义这样的析构函数:
MyObj::~MyObj()
{
for (std::size_t i = 0; i < MyObj::_children.size(); i++)
{
delete MyObj::_children[i];
}
}
我是否在正确的轨道上,或者我的方法是否有缺陷?
PS:如果这是一个直接复制,我道歉,因为我知道有许多问题已经涉及析构函数;我看了一堆,但仍然没有自信。我对C ++缺乏经验,并认为直接的问题对我有用。答案 0 :(得分:1)
除非绝对必要,否则不应使用new
。一旦这样做,您有责任释放动态分配的内存。在上面的代码中:
MyObj m;
MyObj *child = new MyObj();
m.addChild(child);
一旦函数超出范围,m
和child
将调用它们的析构函数,因为它们不是动态分配的,因此会破坏它们。
但是,child
指针指向的内容不以与m
和child
类似的方式销毁,因为它是在new
和delete
中动态分配的通过only
免费存储。在这种情况下,您需要为您在免费商店中放置的每个对象调用@media screen and (max-width: 1180px)
.element {
display: none !important;
}
}
,就像您在上面做的那样。
这就是为什么在评论中人们建议您使用智能指针,因为它们遵循RAII范例,在这种情况下,一旦它们超出范围,对象将自动被释放。