我的内存泄漏是由循环引用引起的吗?



我正在C++创建一个双向链表。添加到列表前面时,我收到以下内存泄漏

Detected memory leaks!
Dumping objects ->
{193} normal block at 0x000001F7A1EC01B0, 16 bytes long.
 Data: < 0              > A0 30 EB A1 F7 01 00 00 00 00 00 00 00 00 00 00 
{192} normal block at 0x000001F7A1EB3090, 96 bytes long.
 Data: < [J             > D0 5B 4A AE F7 7F 00 00 02 00 00 00 01 00 00 00 
{149} normal block at 0x000001F7A1EBF9E0, 16 bytes long.
 Data: <   #            > D8 F7 15 23 E4 00 00 00 00 00 00 00 00 00 00 00 
Object dump complete.

这是我的代码:

struct Node {
    bool exists = false;
    int element;
    shared_ptr<node> prevNode = nullptr;
    shared_ptr<node> nextNode = nullptr;
};
class DLL {
public:
    shared_ptr<Node> frontNode = make_shared<Node>();
    shared_ptr<Node> backNode = make_shared<Node>();
    void frontAdd(int x);
}
void DLL::frontAdd(int x) {
    shared_ptr<Node> tempNode = make_shared<Node>();
    tempNode->exists = true;
    tempNode->element = x;
    tempNode->prevNode = nullptr;
    if (frontNode->exists) {
        tempNode->nextNode = frontNode;
        frontNode->prevNode = tempNode;
    }
    else {
        backNode = tempNode;
    }
    frontNode = tempNode;
};

尝试过使用独特的指针和弱指针,但我不熟悉弱指针,作为初学者,我发现很难将它们与这个项目集成在一起。我尝试删除 frontNode 和 tempNode 上的make_shared,而是在没有make_shared的情况下创建它们,但在这两种情况下,这都会返回写访问冲突,指出"返回 nullptr"。在自动中,tempNode是空的,所以这是有道理的。

由于shared_ptr超出了范围,我希望所有所有权都会丢失并且内存泄漏不存在,但我想由于"make_shared"它被添加到堆中,所以不能那么容易地从内存中删除?

是的,您在所有节点上都有循环依赖关系。每个节点都指向下一个节点和前一个节点,因此每个节点(头和尾)有多个循环依赖项。

例如,您可以通过对上一个链接使用weak_ptr来解决此问题。这将导致一些性能下降,因为您需要从弱指针获取新的共享指针才能访问以前的节点。

您的循环引用很可能是原因。 shared_ptr不是那么聪明,只是计算引用的数量,而后退指针使计数不为零。

对于可能被视为"后退"指针的任何内容,无论是来自从属子对象还是具有 2 向列表,都需要使用原始指针或 weak_ptr<>。

weak_ptr<>具有运营成本,但具有子对象只需很少的编码工作即可安全运行的优点。

相关内容

  • 没有找到相关文章

最新更新