【问题标题】:Unhandled exception Access violation writing location 0xCDCDCDCD - in Structure C++未处理的异常访问冲突写入位置 0xCDCDCDCD - 在结构 C++ 中
【发布时间】:2015-12-05 07:21:18
【问题描述】:

我创建了一个结构指针。并为其赋值。我试图打印分配给它的值。它抱怨未处理的异常访问冲突写入位置0xCDCDCDCD。这样做有什么问题?如何无一例外地完成这项任务?

StructCol.h

#include "stdafx.h"
#ifndef StructCol_H
#define StructCol_H

#include<string>

using namespace std;

struct ABC
{
    string test;
    int no;

    void print()
    {
        cout << test << endl;
        cout << no << endl;
    }
};

#endif

StructTest2.cpp

#include "stdafx.h"
#include<conio.h>
#include<iostream>
#include<stdio.h>
#include "StructCol.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    ABC*abc = (ABC*)malloc(sizeof(ABC));
    abc->no = 47;
    abc->test = "fyp";
    abc->print();
    //delete abc;
    //abc->print();

    _getch();
    return 0;
}

【问题讨论】:

    标签: c++


    【解决方案1】:

    您的结构包含std::string 元素。该类型需要在创建该对象时执行其构造函数

    您无法使用 malloc 创建结构,因为该 C 函数不知道构造函数。

    C++ newdelete 表达式会做正确的事情。当然,您应该更喜欢使用智能指针而不是手动内存管理(或根本不使用动态分配)。

    修复代码的快速方法是使用newdelete

    ABC *abc = new ABC;
    ...
    delete abc;
    

    【讨论】:

      【解决方案2】:

      不要使用 malloc,使用新的 ou std::unique_ptr。 Malloc 不调用 ABC 构造函数,所以字符串构造函数也不会被调用。

      【讨论】:

        【解决方案3】:

        首先,你应该使用free()而不是delete来释放abc指向的内存。

        delete 运算符只能与new 运算符一起使用。

        其次,您收到此错误很可能是因为使用delete 后的第二个打印语句。

        释放某个位置的内存后,您不应以任何方式访问它,因为操作系统可能会回收它,您可能无法再访问它。 访问冲突错误表示操作系统提供的安全性以防止未经授权的进程访问内存。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-08-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-26
          • 2020-08-09
          • 1970-01-01
          相关资源
          最近更新 更多