C++ 如何测试在C++;
我在测试一个释放链表内存的递归函数。我试图在删除列表后打印其内容,以确保它已被删除,但由于指针仍然存在,似乎无法测试节点是否已被删除。我在使用更简单的函数删除列表时也会遇到同样的错误。除非我在某个地方犯了错误,否则我的问题是: 是否有方法测试已删除的节点 我的删除功能:C++ 如何测试在C++;,c++,linked-list,C++,Linked List,我在测试一个释放链表内存的递归函数。我试图在删除列表后打印其内容,以确保它已被删除,但由于指针仍然存在,似乎无法测试节点是否已被删除。我在使用更简单的函数删除列表时也会遇到同样的错误。除非我在某个地方犯了错误,否则我的问题是: 是否有方法测试已删除的节点 我的删除功能: template <typename node> void deleteList(node root) { if (!root) { return; } deleteList
template <typename node>
void deleteList(node root) {
if (!root) {
return;
}
deleteList(root->next);
delete root;
}
模板
void deleteList(节点根){
如果(!root){
返回;
}
删除列表(根->下一步);
删除根;
}
我的打印列表功能:
template <typename node>
void printList(node root) {
node current = NULL;
if (root) {
current = root;
cout << "if (root) == true\n";
cout << "root is: " << root << "\n";
}
while (current) {
cout << current->in << "\n";
current = current->next;
}
}
模板
无效打印列表(节点根){
节点电流=零;
如果(根){
电流=根;
cout当您释放内存时,最好将指向它的指针设置为null(nullptr
,在现代C++中)。这使得以后测试内存是否被释放更加容易。这是防御编程的一部分
这将导致您的(!root)
检查释放的内存是否失败。对于所有动态分配的内存,您都应该遵循这一做法,以避免尝试使用无效指针。由于空指针而崩溃比让代码看起来正常工作但实际上已损坏要好得多。删除不会将指针设置为空ptr
,您可以必须手动执行此操作:
template <typename node>
void deleteList(node& root) {
// ^
if (!root) {
return;
}
deleteList(root->next);
delete root;
root = nullptr; // <<<<<<<<<<<
}
模板
无效删除列表(节点和根){
// ^
如果(!root){
返回;
}
删除列表(根->下一步);
删除根;
root=nullptr;//为什么在调用deleteList(节点)之后调用printList(节点)
首先?@Peter想测试列表是否被正确删除?我知道这是期望值。我想问为什么这是期望值。这类似于在变量超出范围后尝试访问变量。最普遍的解决方案是不尝试测试此类情况,而是防止它们首先是设计出来的。也就是说,尽管我认为这个问题的前提存在根本性的缺陷,但我已经标记了你的答案,因为它确实提供了问题的解决方案。@Peter yes,这纯粹是为了测试。我最初的印象是,删除的指针在if语句中会返回false,但quickly了解到指针仍然有效,但指向垃圾。这让我想知道如何防止这种情况发生,现在我发现了NULLPTR的用法当我已经向它传递指针时,node&root
的目的是什么?(我知道只有这样做它才能正常工作,但我不明白为什么)如果没有&
,指针root
是按值传递的。虽然可以更改root
指向的内容,但按值传递root
意味着函数接收调用者传递的值的副本和赋值(如root=nullptr
)仅更改本地副本。因此,参数列表中的node&root
的目的是使调用者可以看到赋值root=nullptr
的效果。我现在明白了。我已经习惯了指针作为参数可以直接影响其内容的事实,以至于我没有想到指针本身是本地的,谢谢。