C++ C+中的外部dll、静态函数和char*关系+;

C++ C+中的外部dll、静态函数和char*关系+;,c++,pointers,dll,delete-operator,C++,Pointers,Dll,Delete Operator,我正试图弄明白,如何正确地编写这个场景: 在C++应用程序中,我通过LoadLibrary调用外部DLL,然后: char * _input = new {... is created here with some data} char *aallocchrar =new char[10000]; fnHello(_input,aallocchrar); fnHellois是dll中的静态函数。它返回void,但用一些数据填充aallocchrar指针 在这之后,我会 delete[] _a

我正试图弄明白,如何正确地编写这个场景:

在C++应用程序中,我通过LoadLibrary调用外部DLL,然后:

char * _input = new {... is  created here with some data}
char *aallocchrar =new char[10000];
fnHello(_input,aallocchrar);
fnHellois是dll中的静态函数。它返回void,但用一些数据填充aallocchrar指针

在这之后,我会

delete[] _aallocchrar;
它总是抛出内存错误。在静态函数内部,在最后,我尝试使用:

return 0;
exit(1);
退出(1)即使在函数执行时也会崩溃

如何做到完美?传递指针,填充数据,退出dll函数。为什么那个邪恶的dll改变了我的aallochar函数,我以后不能删除它?如何正确结束静态dll函数-退出?-所以它应该释放我的指针

在dll函数中,我对_aallocchrar*所做的一切是:

strcat (str, ";\n\n");
我不会重新分配它或类似的东西。功能定义为:

void __declspec(dllexport) __cdecl runMainRoutine(char* _inputString, char* finalResult)
EDIT1:此函数适用于传递的字符数组:

char* eqn_output(pPLA PLA, char* str)
{

//
register pcube p, last;
register int i, var, col, len;
int x;
bool firstand, firstor;

if (cube.output == -1)
fatal("Cannot have no-output function for EQNTOTT output mode");
if (cube.num_mv_vars != 1)
fatal("Must have binary-valued function for EQNTOTT output mode");
makeup_labels(PLA);

/* Write a single equation for each output */
for(i = 0; i < cube.part_size[cube.output]; i++) 
{
strcat (str, OUTLABEL(i));
strcat (str, " = ");
//printf("%s = ", OUTLABEL(i));
col = strlen(OUTLABEL(i)) + 3;
firstor = TRUE;

/* Write product terms for each cube in this output */
foreach_set(PLA->F, last, p)
    if (is_in_set(p, i + cube.first_part[cube.output])) {
    if (firstor)
    {
        strcat (str, "(");
        col += 1;           
       // printf("("), col += 1;
    }
    else
    {
    strcat (str, " | (");   
    col += 4;
    //printf(" | ("), col += 4;

    }
    firstor = FALSE;
    firstand = TRUE;

    /* print out a product term */
    for(var = 0; var < cube.num_binary_vars; var++)
        if ((x=GETINPUT(p, var)) != DASH) {
        len = strlen(INLABEL(var));
        if (col+len > 72)
        {
            strcat (str, "\n    "); 
            col = 4;
            //printf("\n    "), col = 4;
        }
        if (! firstand)
        {
            strcat (str, "&");
            col += 1;
            //printf("&"), col += 1;
        }
        firstand = FALSE;
        if (x == ZERO)
        {
            strcat (str, "!");
            col += 1;
            //printf("!"), col += 1;
        }
        //printf("%s", INLABEL(var)), col += len;
        strcat (str, INLABEL(var));
        col += len;
        }
    //printf(")"), col += 1;

    strcat (str, ")");
    col += 1;
    }
strcat (str, ";\n\n");
//printf(";\n\n");
}
char*eqn_输出(pPLA PLA,char*str)
{
//
寄存器pcube p,最后一个;
寄存器int i、var、col、len;
int x;
布尔第一,第一;
if(cube.output==-1)
致命(“EQNTOTT输出模式不能没有输出功能”);
如果(cube.num\u mv\u vars!=1)
致命(“EQNTOTT输出模式必须具有二进制值函数”);
化妆品标签(PLA);
/*为每个输出编写一个方程式*/
对于(i=0;iF,last,p)
if(是_在_集中(p,i+cube.first_part[cube.output])){
if(firstor)
{
strcat(str,“(”);
col+=1;
//printf(“(”),col+=1;
}
其他的
{
strcat(str,“|”(”);
col+=4;
//printf(“|”(”),col+=4;
}
firstor=假;
firstand=TRUE;
/*打印产品术语*/
对于(var=0;var72)
{
strcat(str,“\n”);
col=4;
//printf(“\n”),col=4;
}
如果(!firstand)
{
strcat(str,“&”);
col+=1;
//printf(“&”),col+=1;
}
firstand=FALSE;
如果(x==零)
{
strcat(str,“!”);
col+=1;
//printf(“!”),列+=1;
}
//printf(“%s”,INLABEL(var)),col+=len;
strcat(str,INLABEL(var));
col+=len;
}
//printf(“)”,col+=1;
strcat(str,“)”;
col+=1;
}
strcat(str,“;\n\n”);
//printf(“;\n\n”);
}

听起来像是在对未初始化的字符串执行“strcat()”

我想这可能会导致分割冲突,嗯


问:如果替换“strcpy()”,会发生什么情况?您仍然遇到问题吗?

是缓冲区溢出吗?您没有将缓冲区大小传递给DLL函数,您确定缓冲区足够大吗?老兄,为什么不告诉我们为什么“邪恶的DLL更改Allocchrar”?“FNHhello”的代码在哪里??另外:您是否尝试过使用MSVS调试器进入代码?您看到了什么?嗯,在Visual Studio调试窗口中,我可以看到aallocchrar在字符数组的末尾追加了新数据。我想这意味着缓冲区没有溢出,否则我会立即出错,但不会在delete[]行,对吗?函数的代码太大了,我尽力解释。它对Allochrar所做的只是在里面附加了一些带有strcat的数据DLL@user2426290:您想错了。调试窗口只是将所有内容打印到第一个NUL,就像所有字符串处理函数一样。它没有检查溢出。谢谢大家的回复。也许是这样确实是溢出问题,因为我一直在使用strcat。我原以为Visual Studio 2012会立即崩溃。我现在就去检查它。@user2426290写入数组边界未定义。VS2012不一定要崩溃。如果它崩溃,那就意味着你很幸运看到它。天哪,我真的使用了Unitized string.H广告内容:char*aallocchrar=new char[10000]();用C#编码就这么多了,2年了,感觉有点迟钝