对于C和C++,链表的指针指向其头节点。但是,所有节点都是通过malloc()或new分配在堆上的。当头指针超出其范围时它的功能退出,在堆上分配的所有节点都将丢失。对?这是内存泄漏吗?C / C++如何处理此类问题?它会自动调用deallocator吗? (例如free()或Delete)? 最佳答案 处理此类问题的更好方法是使用标准容器,而不是使用一些自制的容器,除非您有充分的理由并知道您在做什么,以及为什么...std::vector std::list 但是要选择一个容器,重要的是要知道您在做什么,寿命应该是什么。@Jack-不管您做什么,标准容器都不会神奇地为您分配手动分配的对象。从根本上讲这是不可能的。您必须更改解决问题的方法,才能将问题视为“手动分配的对象”。一旦实现了这一飞跃,并且意识到这是一个糟糕的路要走,那么您就可以在“它们是值(value)对象”或“它们将由shared_ptr管理”之间进行选择。EX1:使用shared_ptr来保存新对象(如果在MyNode上进行复制不是一个好主意[性能,拥有的资源,保留的状态],则使用此方法):void MyFunction(){ typedef boost::shared_ptr<MyNode> NodePtr; std::list<NodePtr> my_list; my_list.push_back(NodePtr(new MyNode(args...))); my_list.push_back(NodePtr(new MyNode(args...))); ... // when this function exits, the nodes, which are owned by shared_ptr's // which are themselves owned by a stack instance of std::list<> // will be automatically deleted, no leaks anywhere...}EX2:如果节点价格便宜,可以将其视为可复制对象(值语义):void MyFunction(){ std::vector<MyNode> my_list; my_list.push_back(MyNode(args...)); my_list.push_back(MyNode(args...)); ... // when this function exits, the nodes, which are shored directly as copies // in the vector container, will be automatically deleted, no leaks anywhere...}而且,如果您出于某种原因确实希望手动管理实例(通常这样做是因为生命周期并没有真正与单个容器的生命周期相关联,而是有一些不规则的生命周期,除了自定义算法之外,其他任何事物都不能将其整齐地封装):void MyFunction(){ std::list<MyNode*> my_list; my_list.push_back(new MyNode(args...)); my_list.push_back(new MyNode(args...)); ... // we must manually deallocate the nodes because nothing else has been given // responsibility anywhere (we're manually managing them) typedef std::list<MyNode*>::iterator iterator; for (iterator it = std::begin(my_list), end = std::end(my_list); it != end; ++it) delete *it; // manually releases our allocated memory from the heap // the "head" is still deleted automatically because it is stack allocated // (the list object)}关于c++ - 在C/C++中,链表仅在堆栈中分配了头指针,而在堆中分配了其他节点。这可能会导致内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8198006/
10-08 23:18