在 filePath.exe 中的 0x793F3729 (vcruntime140d.dll) 处引发异常:0xC0000005:访问冲突写入位置 0xCDCDCDCD

Posted

技术标签:

【中文标题】在 filePath.exe 中的 0x793F3729 (vcruntime140d.dll) 处引发异常:0xC0000005:访问冲突写入位置 0xCDCDCDCD【英文标题】:Exception thrown at 0x793F3729 (vcruntime140d.dll) in filePath.exe: 0xC0000005: Access violation writing location 0xCDCDCDCD 【发布时间】:2020-08-09 10:41:08 【问题描述】:

我正在尝试将链表实现为堆栈,因此我在 C++ 中为它创建了一个自定义类。 下面是我用来将 temp1 变量推入堆栈的内容。我当前的问题是当我压入堆栈时,它会引发异常。

cityNode temp1(dest, cost + dataVector[index].cost, time + dataVector[index].time);
stack->pushCity(temp1);

这是节点。

class cityNode 
    public:
        string name;                        // City name
        double totalCost;                   // Total cost of the flight
        int totalTime;                      // Total time of the flight
        cityNode* destCity;                 // Pointer to the next destionation city

        cityNode(string cityName, double cityCost, int cityTime) 
            name = cityName;
            totalCost = cityCost;
            totalTime = cityTime;
            destCity = nullptr;
        
;

下面是我的代码。当前在到达代码的newCity->totalCost = cityNode.totalCost; 部分时会抛出异常。

class CityStack 
    public:
        class cityNode* top = NULL;
        void pushCity(cityNode cityNode) 
            class cityNode* newCity = (class cityNode*) malloc(sizeof(class cityNode));
            newCity->name = cityNode.name;
            newCity->totalCost = cityNode.totalCost;            // Exception Thrown
            newCity->totalTime = cityNode.totalTime;
            newCity->destCity = top;
            top = newCity;
        

        void popCity() 
            if (top == NULL) 
                cout << "Stack Underflow" << endl;
            
            else 
                top = top->destCity;
            
        

        bool emptyCity() 
            if (top == NULL)
                return true;
            else
                return false;
        

        void reverseCity() 
            cityNode *prev, *cur, *succ;
            cur = prev = top;
            //cur = cur->destCity;
            while (cur != NULL) 
                cityNode *temp = cur->destCity;
                delete cur;
                cur = temp;
            

            //prev->destCity = NULL;
            while (prev != NULL) 
                cityNode *temp = prev->destCity;
                delete prev;
                prev = temp;
            

            while (cur != NULL) 
                succ = cur->destCity;
                cur->destCity = prev;
                prev = cur;
                cur = succ;
            
            top = prev;
        

        void displayCities() 
            cityNode *stack = top;
            while (stack != NULL) 
                cout << stack->name << " ";
                stack = stack->destCity;
            
            cout << endl;
        

        cityNode* getCityNode() 
            return top;
        
;

【问题讨论】:

【参考方案1】:

0xcdcdcdcd被Visual Studio用来标记未初始化的堆内存;您读取了此类未初始化的内存,从而获得了此无效指针。你应该在 C++ 中使用new,而不是malloc

void pushCity(cityNode cn) 
  cityNode* newCity = new cityNode(cn.name, cn.totalCost, cn.totalTime);
  newCity->destCity = top;
  top = newCity;

new 将分配正确的内存量,并适当地调用您的构造函数。同时,malloc 只会分配一些正确大小的内存,但不做任何初始化对象的操作。这导致undefined behavior。

【讨论】:

当我这样做时,它给了我这个结果:identifier "newCity" is undefined @ThuVu 不要让参数名和类名一样。我将编辑代码并进行完整修复 @ThuVu 试试写的代​​码;它现在应该可以工作了,因为参数的名称与类的名称没有冲突【参考方案2】:

正如其他人所提到的,使用 new 代替 但是如果您出于任何原因坚持使用 malloc 分配内存(例如,当 new 无法为任何原因分配内存时避免异常,例如没有足够的内存)

你需要通过“replacement new”显式调用构造函数

   class cityNode* newCity = (class cityNode*) malloc(sizeof(class cityNode));
   if(newCity ==0)
    throw("can't allocate memory");
    new(newCity)  cityNode();
    ...
    //you need to call destructor expilictly too
    newCity.~cityNode();
    //you still must use free() not delete
    free(newCity);

【讨论】:

【参考方案3】:

不要在 C++ 程序中使用malloc(除非您真的知道自己在做什么),因为它不会为您正在创建的对象调用构造函数。

替换这个

class cityNode* newCity = (class cityNode*) malloc(sizeof(class cityNode));

有了这个

cityNode* newCity = new cityNode;

【讨论】:

以上是关于在 filePath.exe 中的 0x793F3729 (vcruntime140d.dll) 处引发异常:0xC0000005:访问冲突写入位置 0xCDCDCDCD的主要内容,如果未能解决你的问题,请参考以下文章

Magnolia 在西方文化中的含义

如何唯一存储在存储在向量中的对象中的数据?

为啥在与数组中的字段匹配时,mongoDB聚合中的查找中的管道不起作用?

在 UIScrollview 中的 UIView 上的屏幕中的框架

JavaScript中的变量在内存中的具体存储形式

我可以在 apatch 中的 php 文件中播放位于硬盘中的文件路径中的视频吗?