【发布时间】: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