Visual Studio版本之间不同的未分配内存行为

时间:2012-05-11 13:20:39

标签: c++ visual-studio visual-c++ memory-management compiler-errors

我有一个奇怪的情况。我正在尝试将10年以上的pci相机设备SDK应用到我的相机管理软件中。 Manifacturer不再经营,我没有机会获得官方帮助。我在这里,寻找一些帮助解决我丑陋的问题。

SDK附带Visual Studio 6.0个样本。其中一个包含文件的结构以一个字节数组结尾,如下所示;

typedef struct AVData {
    ...  
    BYTE audioVideoData[1];
}AVDATA, *PAVDATA;

但是这个单字节分配的字节数组接收视频帧并且很奇怪,它适用于Visual Studio 6.0版本。如果我使用Visual Studio 2005/2008/2010进行尝试,我会开始收到Memory Access Violation错误消息,这些消息实际上是有意义的,因为之后不应该为固定大小的数组分配空间,不是吗?但是同样的代码在VS 6.0中运行良好?!它可能是由编译器或c ++运行时差异引起的,但我对这个主题并不是很有经验,所以我很难说出某些原因。

我尝试将大小更改为预期的最大字节数,如下所示;

typedef struct AVData {
    ...  
    BYTE audioVideoData[20000];
}AVDATA, *PAVDATA;

这有助于它开始工作,但在尝试销毁库的解码器对象时,我不时会遇到内存访问冲突问题。

这确实有问题。我没有SDK的源代码,只有DLL,Lib和Header文件。我的问题是:

1)在Visual Studio 6.0版本中为固定大小的数组分配空间是否合法?

2)是否有任何可能的方法(编译器选项等)使相同的代码适用于较新的VS版本/ C ++运行时?

3)由于我对编辑头文件的解决方法很有效但仍有问题,你知道有什么更好的解决方法吗?

3 个答案:

答案 0 :(得分:3)

IIRC是一个创建大小可变的结构的老技巧。

考虑

struct {
  int len;
  char name[1];
} s;

如果完成了适当的分配,'name'现在可以是可变长度的,并且它将按顺序排列在内存中:

char* foo = "abc";
int len = strlen(foo);

struct s* p = malloc( sizeof(int) + len + 1 );

p->len = len;
strcpy(p->name, foo );

我认为以上内容在新版本的visual studio中也可以正常工作,也许这是打包的问题,​​你是否已经完成#pragma pack(1)以获取字节边界上的结构?我知道VS6有默认值。

答案 1 :(得分:3)

像这样的C结构中的单元素数组通常意味着在运行时之前大小是未知的。 (有关Windows示例,请参阅BITMAPINFO。)

通常,会有一些其他信息(可能在结构中)告诉您缓冲区需要多大。你永远不会直接分配其中一个,而是分配正确大小的内存块,然后投射它:

int size = /* calculate frame size somehow */
AVDATA * data = (AVDATA*) malloc(sizeof(AVDATA) + size);
// use data->audioVideoData

答案 2 :(得分:1)

代码几乎肯定会以某种方式展示未定义的行为,除了修复SDK的接口或源代码之外,没有办法解决这个问题。由于它不再经营,这是不可能的。