首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用gdb调试"malloc错误:未分配已释放的指针“

使用gdb调试"malloc错误:未分配已释放的指针“
EN

Stack Overflow用户
提问于 2014-08-29 01:48:15
回答 1查看 3.7K关注 0票数 1

我正在尝试编写标准容器std::list的简约版本,作为一个C++练习。但是,我在内存管理方面遇到了困难,因为我是C++新手,来自python/java,在那里我们不必担心太多。守则如下:

代码语言:javascript
复制
#include <memory>
#include <cstddef>
#include <iostream>

template <typename T> class List {
    public:
        typedef std::size_t size_type;
        typedef T value_type;
        typedef T& reference;
        typedef const T& const_reference;

        template <typename U> class Node {
            public:
                Node() { 
                    data = NULL; 
                    init();
                }
                Node(const U val) { 
                    data = new U(val);
                    init();
                }

                void init() {
                    prev = NULL;
                    next = NULL;
                }

                ~Node() {
                    if (data != NULL)
                        delete data;
                    if (prev != NULL)
                        delete prev;
                    if (next != NULL)
                        delete next;
                }

                U* data;
                Node* prev;
                Node* next;
        };


        class iterator {
            public:
                iterator() {
                    n = new Node<T>();
                }
                iterator(const T val) {
                    n = new Node<T>(val);
                }
                iterator(Node<T>* nodeptr) {
                    n = nodeptr;
                }
                ~iterator() {
                    delete n;
                }       

                iterator operator++() {
                    n = n->next;
                }
                iterator operator--() {
                    n = n->prev;
                }
                T& operator*() {
                    return *(n->data);
                }
                bool operator==(iterator other) {
                    return (this->n == other.n);
                }   
                Node<T>* n;
        };

        List() {
            _begin = new iterator();
            _end = new iterator(begin.n);
        }

        List(size_type n, T val) {
            init(val);
        }

        ~List() {
            delete _begin;
            delete _end;
        }

        void init(T val) {
            _begin = new iterator(val);
            Node<T>* nextNode = new Node<T>();
            _begin->n->next = nextNode;
            nextNode->prev = _begin->n;
            _end = new iterator(nextNode);
        }

        void push_back(T val) {
            if(_begin == _end) {
                delete _begin;
                delete _end;
                init(val);
            }
            else {
                Node<T>* endNode = _end->n;
                Node<T>* lastNode = endNode->prev;
                Node<T>* append = new Node<T>(val);
                lastNode->next =  append;
                append->next = endNode;
                append->prev = lastNode;
                endNode->prev = append;
            }
        }

        iterator begin() {return *_begin;}
        iterator end() {return *_end;}
    private:
        iterator* _begin;
        iterator* _end;
};

int main() {
    List<int> derp= List<int>(3,3);
    List<int>::iterator i = derp.begin();
    std::cout << *i;
    derp.push_back(4);
    std::cout << *i;
}

当我运行代码时,我得到以下输出:

代码语言:javascript
复制
a.out(814) malloc: *** error for object 0x7fbab0403a70: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
33Abort trap: 6

我使用GNU调试器按预期设置断点,并得到以下结果:

代码语言:javascript
复制
(gdb) break malloc_error_break
Function "malloc_error_break" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (malloc_error_break) pending.
(gdb) run
Starting program: /Users/samadwara/Projects/C++/a.out
Reading symbols for shared libraries ++.............................. done
Breakpoint 1 at 0x7fff90721588
Pending breakpoint 1 - "malloc_error_break" resolved
a.out(835) malloc: *** error for object 0x100103a90: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug

Breakpoint 1, 0x00007fff90721588 in malloc_error_break ()
(gdb) backtrace
#0  0x00007fff90721588 in malloc_error_break ()
#1  0x00007fff90722942 in free ()
#2  0x0000000100001864 in List<int>::Node<int>::~Node (this=0x100103a70) at list2.cpp:30
#3  0x0000000100001894 in List<int>::Node<int>::~Node (this=0x100103ad0) at list2.cpp:32
#4  0x00000001000018d0 in List<int>::Node<int>::~Node (this=0x100103a70) at list2.cpp:34
#5  0x000000010000190f in List<int>::iterator::~iterator (this=0x7fff5fbff930) at list2.cpp:55
#6  0x00000001000012ae in main () at list2.cpp:117
(gdb) frame 2
#2  0x0000000100001864 in List<int>::Node<int>::~Node (this=0x100103a70) at list2.cpp:30
warning: Source file is more recent than executable.
30                          delete data;
(gdb) l
25                      next = NULL;
26                  }
27
28                  ~Node() {
29                      if (data != NULL)
30                          delete data;
31                      if (prev != NULL)
32                          delete prev;
33                      if (next != NULL)
34                          delete next;

我看到问题在于删除数据,但据我所知,数据总是用new初始化,所以我没有看到问题。任何建议,即使是在其他方面的守则,将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-29 01:53:15

问题是:

代码语言:javascript
复制
            ~Node() {
                if (data != NULL)
                    delete data;
                if (prev != NULL)
                    delete prev;
                if (next != NULL)
                    delete next;
            }

删除第一个节点时,它尝试通过delete next;删除第二个节点。

然而,在第二个节点的~Node()中,它试图再次通过delete prev;删除第一个节点。

正确的方法是只删除~Node()中的~Node();迭代列表以删除每个节点,而不是通过prevnext删除。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25560548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档