Emi*_*dın 5 c++ memory-management compiler-errors visual-studio visual-c++
我有一个奇怪的情况.我正在尝试将10年以上的pci相机设备SDK应用到我的相机管理软件中.Manifacturer不再经营,我没有机会获得官方帮助.我在这里,寻找一些帮助解决我的丑陋问题.
SDK附带Visual Studio 6.0样本.其中一个包含文件的结构以一个字节数组结尾,如下所示;
typedef struct AVData {
...
BYTE audioVideoData[1];
}AVDATA, *PAVDATA;
Run Code Online (Sandbox Code Playgroud)
但是这个单字节分配的字节数组接收视频帧并且很奇怪,它适用于Visual Studio 6.0版本.如果我使用Visual Studio 2005/2008/2010进行尝试,我会开始收到Memory Access Violation错误消息,因为之后不应该将空间分配给固定大小的数组,不是吗?但是同样的代码在VS 6.0中运行良好?!它可能是由编译器或c ++运行时差异引起的,但我对这个主题不是很有经验,所以我很难说出某些原因.
我尝试将大小更改为预期的最大字节数,如下所示;
typedef struct AVData {
...
BYTE audioVideoData[20000];
}AVDATA, *PAVDATA;
Run Code Online (Sandbox Code Playgroud)
这有助于它开始工作,但在尝试销毁库的解码器对象时,我不时会遇到内存访问冲突问题.
这肯定存在一些问题.我没有SDK的源代码,只有DLL,Lib和Header文件.我的问题是:
1)在Visual Studio 6.0版本中为固定大小的数组分配空间是否合法?
2)是否有任何可能的方法(编译器选项等)使相同的代码适用于较新的VS版本/ C++运行时?
3)由于我编辑头文件的工作方式可以达到某一点但仍有问题,你知道有什么更好的方法可以解决这个问题吗?
IIRC 这是创建大小可变的结构的老技巧。
考虑
struct {
int len;
char name[1];
} s;
Run Code Online (Sandbox Code Playgroud)
如果完成了适当的分配,“名称”现在可以是可变长度,并且它将按顺序布置在内存中:
char* foo = "abc";
int len = strlen(foo);
struct s* p = malloc( sizeof(int) + len + 1 );
p->len = len;
strcpy(p->name, foo );
Run Code Online (Sandbox Code Playgroud)
我认为上面的内容在较新版本的 Visual Studio 中也应该可以正常工作,也许这是打包的问题,您是否已完成 #pragma pack(1) 来获取字节边界上的结构?我知道 VS6 已经默认了。
| 归档时间: |
|
| 查看次数: |
286 次 |
| 最近记录: |