我有一个大小为N的数组。所有数组元素都是使用共享指针创建的单链表。这些链接列表由名为S的结构组成。这些S元素具有一些数据,而shared_ptr指向下一个S元素。 array [i]的链表中的最后一个S元素指向nullptr。
当我想清除数组时,如何让共享指针释放所有内存?
一个简单的for循环做数组[i] = nullptr;会不会这样做?或者会吗?
我已经尝试使用shared_ptr到下一个S的双向链表和前一个S的正常指针但是由于普通指针不能放到shared_ptr上,当我到达链接结束时我不能倒退list(我需要结束,以便我可以在时间上向后退一个S并通过使last-1元素指向nullptr来释放当前最后一个元素。)。
而且,对于next = shared_ptr和previous = shared_ptr导致元素相互指向并且共享指针无法释放内存时,双重无效。
或者我应该采用不同的方式进行数组操作,还是仅使用普通指针?
答案 0 :(得分:0)
回答第一个问题,
类型的对象std::shared_ptr<T>
共享其所有权,仅在销毁最后一个shared_ptr时删除托管对象。但是,您可以通过调用
使shared_ptr释放其托管对象std::shared_ptr<T>::reset
此外,对此函数的调用具有与在其值更改之前调用shared_ptr的析构函数相同的副作用(如果此shared_ptr是唯一的,则包括删除托管对象)。
作为链接列表的构建块,不要使用shared_ptr,请使用普通指针。 引用&#34; C ++编程语言&#34;作者:Bjarne Stroustrup,
仅在您确实需要共享所有权时才使用shared_ptr。
答案 1 :(得分:0)
似乎
array[i] = nullptr;
释放所有内存,因为array [i]是shared_ptr并将其设置为nullptr&#34;删除&#34; (正如jensa所提到的,调用reset())shared_ptr所指向的对象,同时删除了对象的shared_ptr(也就是对象),并且因此删除了下一个对象......并且这种情况一直持续到那里& #39;在数组[i]的链表中没有留下shared_ptrs / objects。