【问题标题】:Destructing a global array of List struct破坏 List 结构的全局数组
【发布时间】:2017-12-26 22:13:27
【问题描述】:

我试图破坏一个全局结构数组。
但是,它会在 Visual Studio 2013 中创建以下消息并崩溃。
(g++ 不会崩溃)。是什么导致了这个问题?

消息:

“调试断言失败”_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

这是 List 结构:

template <typename T>
struct List {
    struct ListNode {
        ListNode() : item(0), next(0) {}
        ListNode(T x) : item(x), next(0) {}
        T item;
        ListNode* next;
    };
    T operator[](int idx);
    void insert(T x);
    T get(int idx);
    void print();
    List() : head(0),tail(0),size(0) {}
    ListNode* head;
    ListNode* tail;
    int size;

    ~List() {
        ListNode* h = head;
        while(h) {
            ListNode* n = h->next;
            delete h;
            h = n;
        }
        head = NULL;
        tail = NULL;
        size = 0;
    }

};

列表::插入()

template <typename T>
void List<T>::insert(T x) {
    if(head == NULL) {
        head = new ListNode(x);
        tail = head;
    } else {
        tail->next = new ListNode(x);
        tail = tail->next;
    }
    size++;
}

globa 数组的定义:

List<int> a[1001];

这是我的代码来破坏 List 结构的全局数组:

loop(i,0,N+1) {
    delete &a[i];
}

【问题讨论】:

  • 为什么要手动销毁数组的元素?它会在其作用域结束时自动销毁...
  • 我将其声明为global variable,并且我想在运行程序时尽可能多地利用内存。 (准确地说,我有一些测试用例在终止程序之前会消耗内存。)
  • 考虑添加一个clear() 方法来删​​除列表中的元素,或者不使用全局
  • 堆上没有任何内容...在您的代码中没有使用“新”...您要删除什么?
  • 因为在每个列表上调用.clear()不会调用未定义的行为,所以你不能在不是用new 创建的东西上delete,它是平的搞错了

标签: c++ pointers constructor linked-list destructor


【解决方案1】:

如果您不使用newList&lt;int&gt; a[1001] 不会存储在堆中。

然后您尝试删除它,它会引发内存损坏错误,这是出现此错误的可能原因之一。

调试断言失败“_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

解决方案:使用new

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 2020-02-15
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    相关资源
    最近更新 更多