未处理的异常访问冲突写入位置0xCDCDCDCD - 在结构C ++中

时间:2015-12-05 07:21:18

标签: c++

我创建了一个结构指针。并为其指定值。我试图打印分配给它的值。它抱怨未处理的异常访问冲突写入位置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;
}

3 个答案:

答案 0 :(得分:4)

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

您无法使用malloc创建结构,因为C函数不了解构造函数。

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

首先,您应该使用free()代替delete来释放abc指向的内存。

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

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

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