C++ 在Excel XLL中释放FP*何时安全?

C++ 在Excel XLL中释放FP*何时安全?,c++,c,xll,C++,C,Xll,: 。。。因此,在返回DLL创建的字符串或浮点值时 数组,您有以下选择: 将持久指针设置为动态分配的缓冲区,然后返回指针。在下一次调用函数(1)时,检查 指针不为null,(2)释放上一页上分配的资源 调用指针并将其重置为null,(3)将指针重新用于新的 已分配的内存块 当我自由通话时,我会看到以下错误对话框: 检测到MSVC++调试库堆损坏:正常后 0x处的块(#135)。。。。。。。CRT检测到应用程序向 堆缓冲区结束后的内存 这是我的密码: FP * g_FP; extern "C

:

。。。因此,在返回DLL创建的字符串或浮点值时 数组,您有以下选择:

  • 将持久指针设置为动态分配的缓冲区,然后返回指针。在下一次调用函数(1)时,检查 指针不为null,(2)释放上一页上分配的资源 调用指针并将其重置为null,(3)将指针重新用于新的 已分配的内存块
当我自由通话时,我会看到以下错误对话框:

检测到MSVC++调试库堆损坏:正常后 0x处的块(#135)。。。。。。。CRT检测到应用程序向 堆缓冲区结束后的内存

这是我的密码:

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;
}
FP*g_FP;
外部“C”FP*\uu标准调用XLL填充(长行、长列){
如果(g_FP!=NULL){
免费(g_FP);
g_FP=NULL;
}
g_FP=(FP*)malloc(行*cols*sizeof(double)+2*sizeof(unsigned short int int));
对于(int i=0;i

<>我对C++有点生疏,但我无法想象为什么我的生活不起作用。< /P> < P> <代码> FP> /Cord>是这样声明的:

typedef struct _FP
{
    unsigned short int rows;
    unsigned short int columns;
    double array[1];        /* Actually, array[rows][columns] */
} FP;
您假设
FP
已打包且不包含填充。我不知道XLL是如何编译的,但我认为在
数组
之间很可能有填充,以安排
数组
是8字节对齐的。在默认设置下,MSVC为
sizeof(FP)
返回16,这支持我的假设

将您的分配更改为:

g_FP = malloc((rows*cols-1)*sizeof(double) + sizeof(*g_FP));
即使这不是问题的原因,上面的分配也是逻辑正确的形式

否则我看不出你的代码有什么问题。我认为您可以更明确地将
g_FP
初始化为
NULL
,但这是一个小问题。

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.

省去一些麻烦,从中使用FP类。它的文档是。

在释放g_FP之前是否初始化过它?如果没有,则释放了一个野生指针。@San Jacinto它声明为全局指针,并将初始化为NULL。最好是通过IMV显式地这样做。更准确地说,它具有静态存储持续时间,因此初始化为零。但是,系统上的
NULL
指针不一定有字节值“0”(即使我们写入
void*ptr=0
,也不一定是磁盘上的值)。你应该写
FP*g_FP=0
FP*g_FP=NULL
@TomalakGeret'kal:[dcl.init]^5:“如果
T
是标量类型(3.9),则将对象设置为值0(零),作为一个整型常量表达式,转换为
T
”-我认为这意味着零初始化完全等同于
FP*g_FP=(FP*)0,因此您对实际字节值的考虑不应适用于此处(尽管我还是更喜欢显式初始化全局变量)。@Matteo:噢,嗯。。。好的,我同意正是我的分析。很多thx(尽管我认为你比我快了一分钟按发送键;o))谢谢。事实上,我比你晚了11分钟另一方面,如果
rows*cols
的新值大于以前的值,我想我只会执行free/malloc。这就省去了点击堆分配器的麻烦;o) 。不管怎样都有点尴尬!!!一点也不尴尬。我们都做这样的事情。