...因此,返回DLL创建的字符串或浮点数时 数组,您有以下选择:
- 设置一个指向动态分配缓冲区的持久指针,返回指针。在下次调用函数(1)时检查一下 指针不为空,(2)释放前一个分配的资源 调用并将指针重置为null,(3)重新使用指针 分配的内存块。 ...
我在免费电话时收到以下错误对话框:
MSVC ++调试库HEAP CORRUPTION DETECTED:正常后 阻止(#135)在0x ....... CRT检测到应用程序写入 healp缓冲结束后的记忆。
这是我的代码:
FP * g_FP;
extern "C" FP * __stdcall xllFill(long rows, long cols) {
if (g_FP != NULL) {
free(g_FP);
g_FP = NULL;
}
g_FP = (FP *)malloc(rows * cols * sizeof(double) + 2 * sizeof(unsigned short int));
for (int i = 0; i < rows * cols; i++) {
(*g_FP).data[i] = (double)i;
}
(*g_FP).rows = (unsigned short int)rows;
(*g_FP).cols = (unsigned short int)cols;
return g_FP;
}
我在C ++上有点生疏,但我不知道为什么这不起作用。
答案 0 :(得分:2)
FP
声明如下:
typedef struct _FP
{
unsigned short int rows;
unsigned short int columns;
double array[1]; /* Actually, array[rows][columns] */
} FP;
您假设FP
已打包且不包含填充。我不知道XLL是如何编译的,但我认为很有可能在columns
和array
之间存在填充以安排array
对齐8字节。使用默认设置,MSVC为sizeof(FP)
返回16,这支持我的假设。
将您的分配更改为:
g_FP = malloc((rows*cols-1)*sizeof(double) + sizeof(*g_FP));
即使这不是问题的原因,上面的分配也是逻辑上正确的形式。
否则我看不到你的代码有什么问题。我认为您可以更明确地将g_FP
初始化为NULL
,但这只是一个小问题。
答案 1 :(得分:1)
sizeof(FP)
是16,因为行和列最终会对齐(大概)。我的手动尺寸计算中不允许这样做。
更好的代码是:
g_FP = (FP *)malloc(sizeof(sizeof(FP) - sizeof(double) + rows * cols * sizeof(double)); // -sizeof(double) to account for the double[1] already in the struct def.
答案 2 :(得分:0)
省去一些麻烦并使用http://nxll.codeplex.com中的FP类。它的文档是http://nxll.codeplex.com/wikipage?title=FP。