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

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

我遇到了一个奇怪的情况。我正在尝试为我的相机管理软件实现一个 10 多年历史的 pci 相机设备 SDK。制造商不再营业,我没有机会获得官方帮助。所以我在这里,为我丑陋的问题寻求帮助。

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) 由于我的编辑头文件的解决方法工作到一定程度但仍然存在问题,您知道解决此问题的更好方法吗?

最佳答案

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

考虑

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

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

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 将其作为默认设置。

关于c++ - Visual Studio 版本之间不同的未分配内存行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10552185/

相关文章:

c# - 如何在 Visual Studio 中使用 C# 中其他文件的类?

c++ - 如何使用 cl 编译器在 Windows 中启动 arduino

c++ - 使用 CUDA 编译 main.cpp 文件

C++ `ifdef` 与宏值的串联

c++ - C++ 中的 exit 和 std::exit 有什么区别?

c++ - "deduced A"在调用类型推导的上下文中的含义

c++ - 在 C 函数中返回结构会导致段错误

C++ 移动构造函数 - C++ 之旅

c - WinCE 中的 iMX6Q NAND 引导问题

c++ - 程序和计算器答案之间的 0.5 差异