工具:VS2019
问题描述:
我用C++创建了一个DLL,DLL里主要是一个“Punch_Menual”类,
(1)类里面申明了一个结构体(结构体的具体定义是在类外面写的)
////XXXE.h
#pragma once
#include <iostream>
using namespace std;
class _declspec(dllexport) Punch_Menual;
class Punch_Menual
{
public:
Punch_Menual(); //构造函数
void getnum();
void fun();
public:
int i_max = 0;
public:
struct Ceshi;
Ceshi* ceshi_Arr ; //需要动态获取数组的空间大小,所以这里定义指针数组
};
struct Punch_Menual::Ceshi
{
string name;
string size;
//...
};
(2)然后,在cpp中调用类里面的成员函数,去初始化数组
////"XXXE.cpp"中
#include "pch.h"
#include "XXXE.h"
Punch_Menual::Punch_Menual()
{
}
void Punch_Menual::getnum()
{
//......一些列操作得到 i_max 的值
i_max = 7;
}
void Punch_Menual::fun()
{
ceshi_Arr = new Ceshi[i_max];
ceshi_Arr[0].name = "1号";
ceshi_Arr[1].name = "2号";
ceshi_Arr[2].name = "3号";
ceshi_Arr[3].name = "4号";
ceshi_Arr[4].name = "5号";
}
(3)到这里,“编译”、“生成解决方案”都没有报错,也能成功的生成DLL,然后新建一个MFC的EXE项目调用,
////测试数组
Punch_Menual Punch;
Punch.fun();
string str;
str = Punch.ceshi_Arr[0].name + "\r\n" + Punch.ceshi_Arr[1].name + "\r\n" + Punch.ceshi_Arr[2].name + "\r\n" + Punch.ceshi_Arr[3].name + "\r\n" + Punch.ceshi_Arr[4].name;
MessageBox(str.c_str() );
就会报错:
请高人帮忙指点一下,在下先谢过了!!
问题解决了,到"ceshi_Arr = new Ceshi[i_max];"都是没问题的,出问题在后面的赋值上,我这里贴出来的代码是我重新组织的(跟我出问题的代码差不多过程,说来也奇怪,这段代码也报差不多的错),网上查了一些资料,大概感觉是数组越界之类。
我就去原代码中看什么地方有可能造成越界,我原来代码是在while里赋值的,whle语句里套了小while,小while 里面是用istingstream将字符串按空格分段再取值的,但是我一不小心把i++写到小while 里面了,应该放在放外面的,就导致i++过多,就越界了
// 大概过程如下所示:
string str = "name:xiaoming age:18 subject:English";
string s;
istringstream issd(Toolfile_Line);
while(...一个条件...)
{
//......
while(issd>>s)
{
//...
//...
i++; //就是这里错了,我应该把 i++放在最后的
}
ceshi_Arr[0].name = ...;
ceshi_Arr[1].name = ...;
//应该把 i++ 放在这里
}
算是很低级的粗心错误,由于我代码有点长,一时没看出来,后来分段注释,才看出来。
提一下上面大哥说的那个 string 不适合放在结构体中的事情,确实不适合,编译能通过,但是在相应string 类型变量的赋值语句下面有一条绿色的波浪线,鼠标放上去,会看到一个有关内存的警告:
从”ceshi_Arr“中读取数据无效,可读大小为 ”(unsigned int)*100+4" 字节,但可能读取了”(unsigned int)*200" 字节
我后来也测了一下,用string 赋值调用什么的都可以成功,也没有报错,但是我隐约觉得可能有什么隐患,后来把string 全部换成了char.
菜鸟之见,欢迎指正。
string是对象,不是一段内存,不适合放在结构体中。
一直没注意这方面,怪不得初始化数组得时候,有个提示呢,谢谢谢谢
问题的关键是 “数组越界”!!“数组越界”!!“数组越界”!!解决方法得根据具体代码分析,我这里也只是我个人的例子。