我创建了一个结构指针。并为其指定值。我试图打印分配给它的值。它抱怨未处理的异常访问冲突写入位置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;
}
答案 0 :(得分:4)
您的结构包含std::string
元素。这是一种在创建该对象时需要执行构造函数的类型。
您无法使用malloc
创建结构,因为C函数不了解构造函数。
C ++ new
和delete
表达式将做正确的事情。当然,您应该更喜欢使用智能指针而不是手动内存管理(或根本没有动态分配)。
修复代码的快捷方法是使用new
和delete
:
ABC *abc = new ABC;
...
delete abc;
答案 1 :(得分:1)
不要使用malloc,请使用新的ou std :: unique_ptr。 Malloc不会调用ABC构造函数,因此也不会调用字符串构造函数。
答案 2 :(得分:0)
首先,您应该使用free()
代替delete
来释放abc
指向的内存。
delete
运算符只能与new
运算符一起使用。
其次,由于使用delete
后的第二个打印语句,您很可能会收到此错误。
释放某个位置的内存后,您不应以任何方式访问它,因为操作系统可能会收回它,您可能无法再访问它。 访问冲突错误表示操作系统提供的安全措施,以防止未经授权的进程访问内存。