将数据流式传输到std :: vector <double>崩溃

时间:2016-02-17 10:53:45

标签: c++ vector marshalling dllexport

我有一个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);
}

1 个答案:

答案 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;

更容易理解,不是吗?此外,访问数据和删除对象也更容易。