读取位置 0xcdcdcdc1 时发生访问冲突

Mynameiswuyihao 2010-08-09 10:49:20
调试时到了interface.cpp里的db->Append_back(info1);这一行的时候就提示“读取位置 0xcdcdcdc1 时发生访问冲突”
请帮我看看是怎么回事

//head.h
#ifndef H_HEAD
#define H_HEAD

#include "database.h"
#include "information.h"

using namespace DATABASE;

void console();

#endif

//interface.cpp
#ifndef H_INTERFACE
#define H_INTERFACE

#include "head.h"
#include <stdio.h>
#include <io.h>
using namespace std;

extern DataBase<Info>* db;
const char* infos[] = {"请输入指令:\n", //0
"建立新的数据库\n", //1
"编辑数据库\n", //2
"打印数据库\n", //3
"浏览数据库\n", //4
"备份数据库\n", //5
"还原数据库\n", //6
"退出程序\n", //7
"下一条记录\n", //8
"上一条记录\n", //9
"添加新纪录\n", //10
"删除本条记录\n", //11
"编辑本条记录\n", //12
"返回到上一级\n", //13
"请按次输入:\n\t姓名\n\t性别\n\t年龄\n\t地址\n\t电话号码\n\t电话号码2\n\t以空格分开\n\t跳过的项目以两个以上个空格表示\n",//14
"数据库不存在\n" //15
};
const char* OMf = "%n$%s$%a$%l$%p$%q#";
const char* OMp = "%n\t%s\t%a\t%l\t%p\n";


void console()
{
char in = 0;
/*if (!access("friends.dat",0))
{

}*/
do
{
cout<< "---\t" << infos[0]
<< "1\t---\t" << infos[1]
<< "2\t---\t" << infos[2]
<< "3\t---\t" << infos[3]
<< "4\t---\t" << infos[4]
<< "5\t---\t" << infos[5]
<< "6\t---\t" << infos[6]
<<"Q\\q\t---\t" << infos[7]
<< endl;
if(cin >> in)
{
switch (in)
{
case '1': delete db;
db = new DataBase<Info>;
break;

case '2': if (db == 0)
{
cout << infos[15] << endl;
break;
}
do
{
cout<< "\t1\t---\t" << infos[8]
<< "\t2\t---\t" << infos[9]
<< "\t3\t---\t" << infos[10]
<< "\t4\t---\t" << infos[11]
<< "\t5\t---\t" << infos[12]
<< "\tB\\b\t---\t" << infos[13]
<< endl;
cin >> in;
switch(in)
{
case '1': db->Next();
break;
case '2': db->Previous();
break;
case '3': cout<< "\t---\t" << infos[14] << endl;
{
char n[12];char _s[3];bool s=Info::Male;int a;string l;char p[15];char q[15];
cin >> n >> _s >> a >> l >> p >> q;
if (_s == "女") s = Info::Female;
Info info1(n,s,a,l,p,q);
db->Append_back(info1);
}
break;
}
}while(cin && in != 'B' && in != 'b');
break;

case '4': if (db == 0)
{
cout << infos[15] << endl;
break;
}
{
IO<Info> io1(*db);
io1.Output(cout,OMp);
}
break;

case 'Q': return;
case 'q': return;
}
}
}while (cin);
}
#endif

//information.cpp
#include "information.h"
#include <string>

void Info::Output(ostream& os,const char* omode)
{
int i = 0;
while(omode[i] != '\0')
{
switch (omode[i])
{
case '%':
switch(omode[++i])
{
case 'n':
os << name;
break;
case 's':
os << ((sex==Info::Male)?"男":"女");
break;
case 'a':
os << age;
break;
case 'l':
os << location;
break;
case 'p':
if (phone != 0)
os << phone;
break;
case 'q':
if (phone2 != 0)
os << phone2;
break;
}
break;
default:
os << omode[i];
break;
}
i++;
}
}

Info::Info(const Info& info2):location(info2.location),age(info2.age),sex(info2.sex)
{
if (&info2 == this)
return;
delete[] phone;
delete[] phone2;
phone = new char[sizeof(info2.phone)/sizeof(char)];
phone2 = new char[sizeof(info2.phone2)/sizeof(char)];
int i = 0;
while (info2.phone[i] != '\0')
phone[i] = info2.phone[i++];
phone[i] = '\0';
i = 0;
while (info2.phone2[i] != '\0')
phone2[i] = info2.phone2[i++];
phone2[i] = '\0';

i = 0;
while (info2.name[i] != '\0')
name[i] = info2.name[i++];
name[i] = '\0';
}

Info::Info(char* n,bool s,int a,string l,const char* p,const char* p2):location(l),age(a),sex(s)
{
phone = new char[strlen(p)+1];
phone2 = new char[strlen(p2)+1];
int i = 0;
while (p[i] != '\0')
phone[i] = p[i++];
phone[i] = '\0';
i = 0;
while (p2[i] != '\0')
phone2[i] = p2[i++];
phone2[i] = '\0';

i = 0;
while (n[i] != '\0')
name[i] = n[i++];
name[i] = '\0';
}

//information.h
#ifndef H_INFORMATION
#define H_INFORMATION

#include <string>
#include <iostream>
using namespace std;

class Info
{
private:
char name[12];
bool sex;
int age;
string location;
char* phone;
char* phone2;
public:
enum SEX{Male = true,Female = false};
explicit Info(){}
explicit Info(char* n,bool s,int a,string l,const char* p=0,const char* p2=0);
explicit Info(const Info& info2);

const char* Getname(){return name;}
bool Getsex(){return sex;}
int Getage(){return age;}
string& Getlocation(){return location;}
const char* Getphone(){return phone;}
const char* Getphone2(){return phone2;}

void Output(ostream& os,const char* omode);
};

#endif

//database.h
#ifndef H_DATABASE
#define H_DATABASE

#include <iostream>
#include <list>
using namespace std;
namespace DATABASE
{

template <class T>
class DataBase
{
private:
typedef typename list<T>::iterator Pointer;
list<T> datas;
Pointer pointer;
public:
DataBase():pointer(datas.begin()){}
~DataBase(){}
//DataBase(DataBase& db2){}
void Append_back(T& data){datas.push_back(data);}
void Append_front(T& data){datas.push_front(data);}

void Delete(){datas.erase(pointer);}
void Modify(const T& data){pointer = data;}
void Get(T& data){data = *pointer;}

void GoTop(){pointer = datas.begin();}
void GoBottom(){pointer = datas.end();}

void Next(){pointer++;}
void Previous(){pointer--;}

bool eof(){return pointer == datas.end();}
bool bof(){return pointer == datas.begin();}
};

template <class T>
class IO
{
private:
DataBase<T>& db;
public:
IO(DataBase<T>& d):db(d){}
void Output(ostream& os,const char* omode);
void Input();
};

template <class T>
void IO<T>::Output(ostream& os,const char* omode)
{
T data;
db.GoTop();

while(!db.eof())
{
db.Get(data);
data.Output(os,omode);
db.Next();
}
}
}
#endif

//main.cpp
#include "head.h"
DataBase<Info>* db = 0;

int main()
{
console();

delete db;
return 0;
}
...全文
1338 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
jjokers 2012-08-18
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
lz,存储局部变量就出现访问冲突吗?
[/Quote]
估计是
先存储了局部变量
然后局部变量被释放
然后类中再访问该变量
Usopp_Dream 2012-07-28
  • 打赏
  • 举报
回复
lz,存储局部变量就出现访问冲突吗?
Mynameiswuyihao 2010-08-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 cattycat 的回复:]

读取错误,就是读取的指针未分配内存的错误。
[/Quote]

我想不明白,我是初始化了一个对象,正常,然后把这个对象push到list最后,在这里出错,我在这个过程中会用到什么指针呢?想不明白
cattycat 2010-08-09
  • 打赏
  • 举报
回复
读取错误,就是读取的指针未分配内存的错误。
jackyjkchen 2010-08-09
  • 打赏
  • 举报
回复
太多了,我们这里上网机器不装编译器,编译机器不上网,不方便调试

你单步跟一下,看是哪个指针出的问题
s_xiu_s 2010-08-09
  • 打赏
  • 举报
回复
内存问题 , 访问越界了
Mynameiswuyihao 2010-08-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jackyjkchen 的回复:]

引用 3 楼 mynameiswuyihao 的回复:
引用 2 楼 jackyjkchen 的回复:

0xcdcd…………这典型就是一个未分配指针


未分配指针都是Oxcdcdcdc吗?

不一定,release下就不是,直接声明的栈指针也不是

Oxcdcdcdc已经超出了win32的用户地址空间,进入系统及空间了,内存分配根本分不到这个地址
[/Quote]

恩,大概能理解。。但是程序究竟是哪里出问题了?是指针吗?
jackyjkchen 2010-08-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mynameiswuyihao 的回复:]
引用 2 楼 jackyjkchen 的回复:

0xcdcd…………这典型就是一个未分配指针


未分配指针都是Oxcdcdcdc吗?
[/Quote]
不一定,release下就不是,直接声明的栈指针也不是

Oxcdcdcdc已经超出了win32的用户地址空间,进入系统及空间了,内存分配根本分不到这个地址
Mynameiswuyihao 2010-08-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jackyjkchen 的回复:]

0xcdcd…………这典型就是一个未分配指针
[/Quote]

未分配指针都是Oxcdcdcdc吗?
jackyjkchen 2010-08-09
  • 打赏
  • 举报
回复
0xcdcd…………这典型就是一个未分配指针
Mynameiswuyihao 2010-08-09
  • 打赏
  • 举报
回复
就是用链表的时候push_back那里出了问题,我不知道是怎么回事
Mynameiswuyihao 2010-08-09
  • 打赏
  • 举报
回复
自己解决了,原来是类存储了局部指针变量
课程简介:本课程详细讲解基于Assimp C++库的模型读取模块,并且做了关于动画理论、关键帧插值、骨骼动画矩阵原理、骨骼动画读取与播放等知识的详细讲解,对于游戏行业或者三维可视化从业人员会有比较大的帮助。目前很多公司已经开始构建自己的底层图形引擎,其中动画就是重要的一个版块,本课程可以让学员从原理层面以及底层代码层面了解FBX、OBJ模型的读取本质,并且梳理程序架构,编写骨骼动画。2 课程解决优势:很多同学学习骨骼动画苦于无法找到详细的资料,其中卡主的问题点也比比皆是,比如FBX内嵌材质的读取,骨骼动画各类矩阵的应用,理论结合模型读取库读出来的数据如何一一对应等。我们的课程可以带领大家从原理+实践的角度进行学习,每一个知识点都会:a 推导基础公式及原理 b 一行一行进行代码实践从而能够保证每位同学都学有所得,能够看得懂,学得会,用得上,并且能够培养自主研究的能力。3 学习课程所得:学习本课程完毕之后,学员可以全方位的完全了解基于Assimp库的模型读取结构,了解每一个变量背后的含义,并且课程拥有随堂附赠的源代码,保证同学可以随根据老师的代码纠正自己的错误。跟随课程一行一行写完代码的同学,可以获得自己的模型读取代码库,并且深度理解骨骼动画的原理与模型读取原理 本课程含有全源代码
 OpenGL-自主高性能三维GIS平台架构与实现/第二季:实现三维GIS球体+ 高程数据章节名称DEM基础1DEM基础知识1.介绍基本的DEM知识2.什么是DEM,作用是什么2DEM数据1.如何获取/ 传统测量/激光扫描/无人机测量/ 点云数据/ 倾斜摄影2.如何使用/局部小规模(栅格数据,图片/tif),3. 组织方式4. 根据使用目的不同,介绍多种优化方法3DEM图层的实现原理14DEM数据结构定义struct  V3U3N4顶点数据的生成和计算WGS84投影计算5wgs84 投影球体被切成一个个小圆弧,一共60个投影带,分别为01,02.........60WGS的最新版本为WGS 84(也称作WGS 1984、EPSG:4326),1984年定义、最后修订于2004年。接口定义坐标转换Wgs84 数据加载6瓦片编号计算生成算法1. 经纬度到大地坐标的转换2.大地坐标到经纬度坐标转换3. 根据经纬度获取瓦片编号框架重构7智能指针重构框架1. 基类定义(所有的类继承自基类),基类派生自 std::enbale_shared_from_this2. 实现智能指针的动态转换接口3. 实现向下转换4. 已有的类实现全部使用智能指针重构5. 任务系统(多线程加载任务)8引入图层(Layer)1. 介绍图层的概念以及重要性2. 图层类实现3. 修改框架(使用图层的方式重构框架)9Layer-bug排查(绘制过程中出现错位,偶发)1. 框架重构后遇到问题(绘制结果错误)2. 瓦片索引方式发生变化,多线程中引起内存问题3. 修改索引方式,解决绘制偶发错误问题10引入数据源(TileSource)1. 数据源的作用与设计目的2. 当前存在的问题,数据调度中存在问题3. 数据源(TileSource)类实现11数据格式管理(FormatMgr)1. 数据格式管理(FormatMgr) 提出的目的,需要解决的问题2. CELLFormat基类接口抽象3. 实现几个标准格式类4. 修改框架流程,使用FormatMgr重构流程5. 扩展支持,后续支持任务格式数据加入系统12Task(任务)优化1. 任务中低耦合数据结构,目的是让Task更加的通用2. 修改任务读取代码与任务处理代码,完善处理流程DEM高程13DEM-数字高程定义1. 什么是数字化高程数据2. 当下GIS系统中有哪些常见的高程格式3. 课程体体系中使用的哪种格式4. 高程类定义以及实现,并加入到FormatMgr 管理系统中14高程瓦片数据读取1. 介绍GIS系统相关的工具(在数据转换)数据生成方面可以解决大量间2. 自定义高程瓦片格式说明3. 自定义高程格式文件解析,并以智能对象的方式引入到系统中4. 完善框架代码,适配高程数据15高程瓦片文件的读取1. 实现基本的读取算法2. 增加格式化组件,并加入到系统中3. 配置高程图层以及高程数据源,并加载数据,验证数据正确性16瓦片数据结构重构1.顶点生成2.UV坐标计算3.面数据生成17DEM重构绘制流程1. 修改绘制数据结构,去除无用字段2. 增加Mesh类,实现光栅数据转换成三角面数据,计算UV数据,提炼接口3. 修改系统调度,实现顶点数据,UV数据,以及面数据的生成与更新4. 按需更新数据,而不是每一帧更新18DEM-数据精度问题(CPU)1. 因为瓦片数据使用大地坐标作为系统输入,造成瓦片坐标很大,单浮点数据精度不够2. 使用局部坐标的方式解决单浮点精度问题3. 调整相机参数,解决投影矩阵数据计算深度精度问题4. 修改绘制shader 实现对瓦片数据的绘制19DEM-数据精度问题(LogDepth)1. 使用对数深度(log depth )算法在GPU中 计算解决单浮点经纬计算问题2. 修改shader ,增加对(logDepth)算法支持3. 修改C++端代码,实现对shader数据的输入20DEM-数据结构优化1.当下使用CPU端数据通过接口的方式传递给GPU,速度慢2. 使用Instance 方式降低Vertex Buffer 的大小,优化渲染系统21DEM-GPU缓冲区优化1. 使用Vertex Buffer Object / Index Buffer Object  / Instance  方式优化渲染系统2. 修改绘制接口,使用DrawElementsInstanceBaseInstance方式提升系统性能内存池与对象池22瓦片生成优化/对象池1. 相机移动过程中会频繁的建立与释放瓦片,对CPU有较大的消耗2. 引入内存池,避免频繁的内存申请与释放,降低CPU间3. 改造智能指针对象,对象释放通知到内存管理,回收对象内存23改造任务系统支持对象池1. 任务系统是一个公用模块,被多个模块使用,避免频繁的内存操作,引起的内存碎片2. 实现对象池,并应用到任务模块法线计算24法线计算1. 修改现有顶点结构,增加法线支持2. 修改shader,增加法线顶点输入,使用平行光光照模型3. 修改绘制流程,支持光照计算,使用探照灯作为光源输入25顶点法线计算/共享法线计算1. 增加数据结构保存顶点数据被多个面共享的次数2. 计算面法线,并累加到顶点法线中3. 根据顶点被面共享的次数做平均法线计算4. 修改流程,按需更新法线数据26法线数据压缩1. 法线数据使用3 * float 数据存储,大大的增加了系统的数据2. 实现算法,将3 * float 数据压缩成4字节数据3. 改造绘制代码,支持压缩数据输入27GPU中计算产生法线数据(去掉CPU中计算)1. 引擎支持 Geometry Shader 阶段2. 编写 Geometry Shader,实现法线计算系统功能优化28重构CPU拾取流程1. 当下的拾取流程,只支撑二维数据拾取,无法准群的拾取三维数据2. Terrain中增加拾取接口,输入射线,输出拾取到顶点数据29绘制拾取结果1. 增加一个绘制点的方法,实现绘制代码2. 修改shader,增加logdepth3. 调试代码,花费了很多间排查错误,最总排查到是因为uniform参数笔误写错造成。30任务系统完善,避免任务队列无线膨胀1. 任务系统中,没有限制队列的大小,生产者的能力远大于消费者的能力,造成任务队列膨胀2. 处理办法,限制生产者的生产能力,而不是限制任务队列大小(这种方式会造成业务逻辑异常复杂)3. 使用sleep休眠方式(这种方式是严重错误的)31如何避免瓦片数据抖动1. 产生瓦片抖动的原因 ? 分裂算法与回退算法中间没有过度2. 引入过度流程,避免内存抖动,参数因子是一个重要的数据,需要谨慎使用3. 有必要结合瓦片自身数据动态计算参数因子32瓦片数据管理-fepk文件格式支持-全球数据加载1. 支持fepk文件格式,增加fepk读取组件,适配fepk文件2. fepk管理数据方式:一般情况选择全球前10级别作为基础级别,因数据量不大(1G)左右,后续以8级作为基础级别,全球19级别数据被划分为 2^8 * 2^7(512 * 256)个块。每个块中包含了256 * 256 张小瓦片33fepk高程数据读取 34高程分裂处理当瓦片没有高程数据,那么子节点以及其他后代节点该如何共享父节点的数据35lesson-734-高程瓦片分裂处理(2)-算法实现高程数据分裂算法实现实现对高程数据的切分,并对特殊数据进行处理36高程瓦片分裂处理(3)-问题排查 37高程瓦片分裂处理(4)-(后代节点更新问题)当一个瓦片高程数据更新后,他的儿子节点,孙子节点...该如何处理?38瓦片视锥裁剪错误高程数据更新后,没有技术计算瓦片包围盒信息,造成包围盒错误,进而引视锥计算错误39http支持1.引入三方库 Libcurl2.http类封装,支持http读取数据40fepk.server使用 生成三维地球41改造四叉树-统一使用经纬度输入42地形网络生成算法重构 43引入球体坐标系 44使用球体坐标改造瓦片 45多图层(加载标签数据) 课截图:镜头拉近后,显示细节数据加载矢量SHP国界线数据:加载矢量三维白膜数据截图高程数据加载点云数据 加载倾斜摄影数据 

64,680

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧