Valgrind:将一个指针分配给另一个指针后丢失字节

科斯塔斯科尔

我正在写一个 List 类。当我通过 valgrind 运行程序时,出现以下错误:

==26620== 
==26620== HEAP SUMMARY:
==26620==     in use at exit: 160 bytes in 10 blocks
==26620==   total heap usage: 14 allocs, 4 frees, 82,632 bytes allocated
==26620== 
==26620== 16 bytes in 1 blocks are definitely lost in loss record 1 of 3
==26620==    at 0x4C2B1EC: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==26620==    by 0x10EC98: List<int>::ListNode::addNext(int) (List.h:20)
==26620==    by 0x10E9AB: List<int>::insert(int) (List.cpp:28)
==26620==    by 0x10BA07: main (main.cpp:62)
==26620== 
==26620== 144 (16 direct, 128 indirect) bytes in 1 blocks are definitely lost in loss record 3 of 3
==26620==    at 0x4C2B1EC: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==26620==    by 0x10E93D: List<int>::insert(int) (List.cpp:18)
==26620==    by 0x10BA07: main (main.cpp:62)
==26620== 
==26620== LEAK SUMMARY:
==26620==    definitely lost: 32 bytes in 2 blocks
==26620==    indirectly lost: 128 bytes in 8 blocks
==26620==      possibly lost: 0 bytes in 0 blocks
==26620==    still reachable: 0 bytes in 0 blocks
==26620==         suppressed: 0 bytes in 0 blocks
==26620== 
==26620== For counts of detected and suppressed errors, rerun with: -v
==26620== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)

按照要求:

清单.h

#ifndef CDR_LIST_H
#define CDR_LIST_H

template <typename T>
class List {
private:
class ListNode {
private:
    T entry;
    ListNode *next;
public:
    ListNode(T entry) : entry(entry), next(nullptr) {}
    ~ListNode() {
        if (next != nullptr) {
            delete next;
        }
    }

    void addNext(T entry) {
        this->next = new ListNode(entry); // Here
        setNext(next);
    }

    void setNext(ListNode *next) {
        this->next = next;
    }

    ListNode *getNext() {
        return this->next;
    }

    T getEntry() { return this->entry; }
};

ListNode *root;
int size;
public:
List();
~List();

void deleteList(ListNode *root);

void insert(T entry);

T at(int index);

void deleteAt(int index);

void printList();
};
#endif //CDR_LIST_H

列表.cpp

#include <iostream>
#include "List.h"

template <typename T>
List<T>::List() : size(0) {
this->root = nullptr;
}

template <typename T>
List<T>::~List() {
deleteList(this->root);
}

template <typename T>
void List<T>::insert(T entry) {
if (this->size == 0 || this->root == nullptr) {
    root = new ListNode(entry); // And here
    size++;
    return;
}
ListNode *currNode = this->root;
while (currNode->getNext() != nullptr) {
    currNode = currNode->getNext();
}
currNode->addNext(entry);
this->size++;
}

template <typename T>
T List<T>::at(int index) {
if (index >= this->size) {
    throw std::out_of_range("Index out of list range");
}

ListNode *currNode = this->root;
for (int i = 0; i < index; i++) {
    currNode = currNode->getNext();
}

return currNode->getEntry();
}

template <typename T>
void List<T>::deleteList(ListNode *root) {
if (root == nullptr) {
    delete root;
    return;
}

deleteList(root->getNext());
}

template <typename T>
void List<T>::deleteAt(int index) {
if (index >= this->size) {
    throw std::runtime_error("Index out of range");
}

ListNode *currNode = this->root;
ListNode *parentNode = this->root;
for (int i = 0; i < index; i++) {
    parentNode = currNode;
    currNode = currNode->getNext();
}

parentNode->setNext(currNode->getNext());
// delete currNode;
}

template <typename T>
void List<T>::printList() {
ListNode *currNode = this->root;
while (currNode != nullptr) {
    std::cout << currNode->getEntry() << std::endl;
    currNode = currNode->getNext();
}
}




template class List<int>;

我知道我正在创建一个指针是两种情况,但由于我需要它指向的数据,我无法删除它们。那么,这些情况如何被视为字节丢失,我该如何避免呢?

谢谢

微信
void addNext(T entry) {
        this->next = new ListNode(entry); // Here
        setNext(next); // this line is unnecessary
}

标记的行实际上用相同的值覆盖了 this->next 。虽然它不会改变实际值,但 Valgrind 可能会警告您内存泄漏。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将void指针分配给另一个void指针

来自分类Dev

将指针分配给另一个指针崩溃

来自分类Dev

将内存分配给一个指针,将另一个指针指向该指针,然后删除第二个指针

来自分类Dev

将指针分配给另一个指针,第二个指针是否指向与第一个指针相同的地址?

来自分类Dev

将Object成员变量分配给另一个双重强指针

来自分类Dev

C ++将函数指针分配给另一个

来自分类Dev

使用指针将一个数组分配给另一个数组

来自分类Dev

可以将struct指针方法中的指针重新分配给另一个实例吗?

来自分类Dev

如何将一个指向对象的指针分配给另一个指向相同类的对象的指针?

来自分类Dev

C#:将数组分配给另一个数组:复制还是指针交换?

来自分类Dev

如何将一个char中的值分配给一个指针?

来自分类Dev

是否可以将C ++指针分配给Python对象的属性,然后在另一个C ++函数中将其作为C ++指针检索?

来自分类Dev

分配给另一个参数时来自不兼容指针类型的警告分配

来自分类Dev

将向量分配给另一个向量后缺少元素

来自分类Dev

bash在操作后将变量分配给另一个

来自分类Dev

将受限制的指针分配给另一个指针并使用第二个指针修改值是否合法?

来自分类Dev

将一个信号量分配给另一个

来自分类Dev

将struct的第一个变量分配给另一个

来自分类Dev

将一个shared_ptr分配给另一个

来自分类Dev

Python将值从一个变量分配给另一个

来自分类Dev

将一个对象分配给另一个对象Javascript

来自分类Dev

如何将一个对象的实例分配给一个为空的指针?

来自分类Dev

将指针分配给字符串对象的第一个和最后一个索引

来自分类Dev

如果我将一个右值分配给一个类的指针成员会发生什么?

来自分类Dev

根据另一个向量将向量分配给两个类别

来自分类Dev

根据另一个向量将向量分配给两个类别

来自分类Dev

将malloc变量也分配给另一个变量后,应该如何释放它?(C语言)

来自分类Dev

将一个对象分配给同一类的另一个对象

来自分类Dev

将一个变量分配给另一个变量后,为什么更改一个变量不会更改另一个变量?

Related 相关文章

  1. 1

    将void指针分配给另一个void指针

  2. 2

    将指针分配给另一个指针崩溃

  3. 3

    将内存分配给一个指针,将另一个指针指向该指针,然后删除第二个指针

  4. 4

    将指针分配给另一个指针,第二个指针是否指向与第一个指针相同的地址?

  5. 5

    将Object成员变量分配给另一个双重强指针

  6. 6

    C ++将函数指针分配给另一个

  7. 7

    使用指针将一个数组分配给另一个数组

  8. 8

    可以将struct指针方法中的指针重新分配给另一个实例吗?

  9. 9

    如何将一个指向对象的指针分配给另一个指向相同类的对象的指针?

  10. 10

    C#:将数组分配给另一个数组:复制还是指针交换?

  11. 11

    如何将一个char中的值分配给一个指针?

  12. 12

    是否可以将C ++指针分配给Python对象的属性,然后在另一个C ++函数中将其作为C ++指针检索?

  13. 13

    分配给另一个参数时来自不兼容指针类型的警告分配

  14. 14

    将向量分配给另一个向量后缺少元素

  15. 15

    bash在操作后将变量分配给另一个

  16. 16

    将受限制的指针分配给另一个指针并使用第二个指针修改值是否合法?

  17. 17

    将一个信号量分配给另一个

  18. 18

    将struct的第一个变量分配给另一个

  19. 19

    将一个shared_ptr分配给另一个

  20. 20

    Python将值从一个变量分配给另一个

  21. 21

    将一个对象分配给另一个对象Javascript

  22. 22

    如何将一个对象的实例分配给一个为空的指针?

  23. 23

    将指针分配给字符串对象的第一个和最后一个索引

  24. 24

    如果我将一个右值分配给一个类的指针成员会发生什么?

  25. 25

    根据另一个向量将向量分配给两个类别

  26. 26

    根据另一个向量将向量分配给两个类别

  27. 27

    将malloc变量也分配给另一个变量后,应该如何释放它?(C语言)

  28. 28

    将一个对象分配给同一类的另一个对象

  29. 29

    将一个变量分配给另一个变量后,为什么更改一个变量不会更改另一个变量?

热门标签

归档