何时在Excel XLL中释放FP *是否安全?

时间:2011-10-10 11:25:07

标签: c++ c xll

MSDN states

  

...因此,返回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 ++上有点生疏,但我不知道为什么这不起作用。

3 个答案:

答案 0 :(得分:2)

FP声明如下:

typedef struct _FP
{
    unsigned short int rows;
    unsigned short int columns;
    double array[1];        /* Actually, array[rows][columns] */
} FP;

您假设FP已打包且不包含填充。我不知道XLL是如何编译的,但我认为很有可能在columnsarray之间存在填充以安排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