我有一个C ++ DLL,它接收流数据并将其存储在一系列std::vector
中。然后,附加函数将其转储到XML中。我正在调用这些函数并从C#发送数据。问题是,当我传输数据时,它会达到一定的大小,然后每次都崩溃。
代码://矢量初始化。
std::vector<double> transX;
std::vector<double> transY;
std::vector<double> transZ;
std::vector<double> rotX;
std::vector<double> rotY;
std::vector<double> rotZ;
std::vector<int> frames;
std::vector<string> vTimecode;
//data streams in here and pushes into vectors
__declspec(dllexport) void SetData(double txIN, double tyIN, double tzIN, double rxIN, double ryIN, double rzIN, const char *timecode)
{
frames.push_back(number);
transX.push_back(txIN);
transY.push_back(tyIN);
transZ.push_back(tzIN);
rotX.push_back(rxIN);
rotY.push_back(ryIN);
rotZ.push_back(rzIN);
vTimecode.push_back(timeCode);
number += 1;
}
当矢量大小达到3402时,程序崩溃:
发生了'System.AccessViolationException'类型的未处理异常
附加信息:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。
字符串向量的最大大小为153,391,689,这是最小的。为什么会发生这种情况?
C#:
[DllImport("XmlRecord.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void SetData(double txIN, double tyIN, double tzIN, double rxIN, double ryIN, double rzIN, string TimeCode);
public void Recording(EventArgs args, Processor dproc)
{
double tx = args.result[0].mid.X;
double ty = args.result[0].mid.Y;
double tz = args.result[0].mid.Z;
double rx = args.result[0].rotation.X;
double ry = args.result[0].rotation.Y;
double rz = args.result[0].rotation.Z;
string TimeCode = (dproc.tcHour.ToString() + ":" +
dproc.tcMinutes.ToString() + ":" +
dproc.tcSeconds.ToString() + ":" +
dproc.tcFrames.ToString());
SetData(tx, ty, tz, rx, ry, rz, TimeCode);
}
答案 0 :(得分:-1)
虽然这不能解决您的崩溃问题,但这是一个风格问题。
如果你能够改变它,那么我会从多个向量变为一个对象,并且只有一个向量。
所以你会:
struct MyObject {
double transX;
double transY;
double transZ;
double rotX;
double rotY;
double rotZ;
int frame;
string vTimecode;
};
std::vector<MyObject> objects;
并且插入例程变为
__declspec(dllexport) void SetData(double txIN, double tyIN, double tzIN, double rxIN, double ryIN, double rzIN, const char *timecode)
{
MyObject object;
object.frame = number;
object.transX = txIN;
object.transY = tyIN;
object.transZ = tzIN;
object.rotX = rxIN;
object.rotY = ryIN;
object.rotZ = rzIN;
object.vTimecode = timeCode;
objects.push_back(object);
number += 1;
更容易理解,不是吗?此外,访问数据和删除对象也更容易。