Vergleichen Sie diese beiden weitgehend identischen Funktionen. In der ersten wird der Speicher für buff
zugewiesen mit _alloca. Das funktioniert gut. In der zweiten werden Calloc und Free anstelle von _alloca verwendet. Dies stürzt ab.Warum würde der Aufruf von Calloc'ed Memory mein VC6-Projekt zum Absturz bringen?
Das komische Ding ist, dass ich die calloc/freie Technik in fast jeder anderen GMP-Verpackungsfunktion verwende, die ich habe und sie alle arbeiten. Hier tun sie nicht. Irgendwelche Ideen?
1:
#define Z(x) mpz_t (x); mpz_init((x));
#define BUFF_SIZE (1024 * 32)
BSTR __stdcall IBIGDIV(BSTR p1, BSTR p2) {
USES_CONVERSION;
Z(n1);
Z(n2);
Z(res);
char * buff = (char *) _alloca(mpz_sizeinbase(res, 10) + 2);
LPSTR sNum1 = W2A(p1);
LPSTR sNum2 = W2A(p2);
mpz_set_str(n1, sNum1, 10);
mpz_set_str(n2, sNum2, 10);
if (mpz_sgn(n2) != 0) {
mpz_div(res, n1, n2);
mpz_get_str(buff, 10, res);
} else {
strcpy(buff, "-0");
}
BSTR bResult = _com_util::ConvertStringToBSTR(buff);
return bResult;
}
2:
#define Z(x) mpz_t (x); mpz_init((x));
#define BUFF_SIZE (1024 * 32)
BSTR __stdcall IBIGDIV(BSTR p1, BSTR p2) {
USES_CONVERSION;
Z(n1);
Z(n2);
Z(res);
char * buff = (char *) calloc(mpz_sizeinbase(res, 10) + 2, sizeof(char));
LPSTR sNum1 = W2A(p1);
LPSTR sNum2 = W2A(p2);
mpz_set_str(n1, sNum1, 10);
mpz_set_str(n2, sNum2, 10);
if (mpz_sgn(n2) != 0) {
mpz_div(res, n1, n2);
mpz_get_str(buff, 10, res);
} else {
strcpy(buff, "-0");
}
BSTR bResult = _com_util::ConvertStringToBSTR(buff);
free(buff);
return bResult;
}
Was sagt der Kernspeicherauszug? oder bekommst du nicht eins? – hhafez
BTW, _alloca ist veraltet, verwenden _malloca stattdessen –
Ich würde vermuten, dass mpz_sizeinbase() auf einer neu initialisierten Struktur verwendet 0. 0. Mit alloca, ist Ihr Puffer auf dem Stapel und wird die verschiedenen Strukturen bereits dort abstürzen (und möglicherweise nicht abstürzen). – johnny