これら2つの機能は大きく異なります。最初に、buff
のメモリは_allocaを使用して割り当てられます。これは正常に動作します。 2番目の方法では、_allocaの代わりにcallocとfreeが使用されます。これはクラッシュします。なぜcalloc'edメモリを解放すると私のVC6プロジェクトがクラッシュするのですか?
奇妙なことは、私が持っている他のほとんどすべてのGMPラッピング機能でcalloc/freeテクニックを使用していることです。ここで彼らはしません。何か案は?
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;
}
コアダンプとは何ですか?あなたは1つを取得しないでください? – hhafez
ここで、_allocaは非推奨です。代わりに_mallocaを使用します。 –
新しく初期化された構造体で使用されるmpz_sizeinbase()は0を返すはずです。allocaを使用すると、バッファがスタック上にあり、 )。 – johnny