Visual Studio 2019 调试断言失败

Posted

技术标签:

【中文标题】Visual Studio 2019 调试断言失败【英文标题】:Visual Studio 2019 Debug assertion failed 【发布时间】:2019-11-12 18:19:06 【问题描述】:

我正在尝试制作一个程序来试验 malloc 链表。 I keep getting this error。它说:

调试断言失败!

程序:...ource\repos\ConsoleApplication1\Debug\ConsoleApplication1.exe

文件:minkernel\crts\ucrt\src\appcrt\heap\debug_heap.cpp

线路:904

表达式:_CrtlsValidHeapPointer(block)

这是我的代码:

#include <stdio.h>
#include <corecrt_malloc.h>
#include <cstddef>

struct node_t 

    int value;
    struct node_t* next;
;

void printList(node_t* headNode) 

    node_t* currentNode;
    currentNode = headNode;

    while ((currentNode->next) != NULL) 
        printf("%d, ", currentNode->value);
        currentNode = currentNode->next;
    

    printf("%d", currentNode->value);
    currentNode = currentNode->next;


void addNode(node_t* headNode, int nodeValue) 

    node_t* currentNode = headNode;
    node_t* tempNode = headNode;

    while ((currentNode->next) != NULL) 
        currentNode = currentNode->next;
        tempNode = currentNode;
    

    currentNode = (node_t*)(malloc(sizeof(node_t)));
    currentNode->value = nodeValue;
    tempNode->next = currentNode;
    currentNode->next = NULL;



void popHead(node_t* headNode) 

    node_t* newHead = headNode->next;
    free(headNode);
    headNode = newHead;



void freeAllNodes(node_t* headNode) 

    node_t* currentHead;
    node_t* tempNode;
    currentHead = headNode->next;
    free(headNode);

    while ((currentHead->next) != NULL) 
        tempNode = currentHead;
        currentHead = tempNode->next;
        free(tempNode);
    
    free(currentHead);


int main()

    node_t* nextNode;
    node_t* tempNode;
    node_t* headNode;

    headNode = (node_t*)(malloc(sizeof(node_t)));
    headNode->value = 1;
    headNode->next = NULL;

    printList(headNode);
    printf("\n");

    addNode(headNode, 2);

    printList(headNode);
    printf("\n");

    addNode(headNode, 3);

    printList(headNode);
    printf("\n");

    popHead(headNode);

    freeAllNodes(headNode);
    return 0;


我相信问题出在 Pop Head 上

注意:我不使用“new”和“delete”的原因是因为我希望它尽可能接近常规 c。

【问题讨论】:

按重试并检查调用堆栈。 headNode = (node_t*)(malloc(sizeof(node_t))); 为什么? Stack Frame(在工具栏上)切换回您的代码,看看发生这种情况时正在执行什么。 您提供的代码本质上是 C,而不是 C++。如果你要将它编译为 C++,你应该使用它 - 构造函数,newdeletestd::cout,等等。 【参考方案1】:

popHead 中的 headNode = newHead 赋值是赋值给本地的 headNode 变量。此更改不会传递回调用者。结果是当您调用freeAllNodes 时,您将尝试再次释放此头节点。

可能的解决方案包括将头节点作为引用传递(void popHead(node_t *&amp;headNode)) 或返回新的头节点指针(node_t *popHead(node_t *headNode) ... return headNode;

【讨论】:

以上是关于Visual Studio 2019 调试断言失败的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 调试断言失败 [关闭]

如何在 Visual Studio 2017 中禁用作为调试错误的失败断言?

C++ Visual Studio:调试断言失败!表达式:c >= -1 && c <= 255

如何在调试构建期间使 Visual Studio (2019/2022) 链接到正常的运行时库?

如何禁用调试断言对话框 Visual Studio 或输出 exe

Visual C++ 查找导致“调试断言失败”的行